Django:保存前将模型对象指定为外键
我有两种型号Django:保存前将模型对象指定为外键,django,django-models,Django,Django Models,我有两种型号 class A(models.Model): title = models.CharField() class B(models.Model): heading = models.ForeignKey(A) content = models.CharField() 当我尝试执行以下操作时,我得到的是IntegrityError:b.标题不能为null b = B() a = A() b.heading = a b.heading.title = 'ti
class A(models.Model):
title = models.CharField()
class B(models.Model):
heading = models.ForeignKey(A)
content = models.CharField()
当我尝试执行以下操作时,我得到的是IntegrityError:b.标题不能为null
b = B()
a = A()
b.heading = a
b.heading.title = 'title'
b.content = 'content'
b.heading.save()
b.save()
为什么会这样?我们不能这样处理对象吗?这实际上与你做事的顺序有关 首次将
a
分配给b.heading
时,a
对象尚未保存,并且没有主键。因此,在赋值时,b.heading\u id
将保持None
b.heading
对b
一无所知,因此保存时,b.heading\u id
将保持None
。当保存b
时,它希望b.heading\u id
具有有效的非空值,而它显然没有。因此,提出了一个整数错误
您应该做的是在保存a
后执行作业:
b = B()
a = A()
a.title = 'title'
a.save()
b.heading = a
b.content = 'content'
b.save()
你可能是指
b.save()
而不是b.content.save()
?是的!它的b.save()
纠正了为什么标题\u id
不能以这种方式更新的问题b.heading
还应引用相同的对象,并且b.heading.save()
还应在属性中应用相同的更改(我的意思是创建新的主键值)。保存b.heading
时,模型对象本身会获得主键值。但是,随着外键(更具体地说是ReverseSingleRelatedObjectDescriptor
)的实现,保存已分配的外部对象不会更改原始模型上的外键值<代码>a是b。heading将始终返回True
,因为它们是相同的对象,但这并不意味着b。heading\u id
将始终指向正确的值。您需要一个额外的分配来确保,可以是a
保存后的b.heading=a
,或者b.heading\u id=a.pk
。