Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:保存前将模型对象指定为外键_Django_Django Models - Fatal编程技术网

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