假设我有以下两个Django模型A
和B
:
class A(models.Model):
pass
class B(models.Model):
a = models.ForeignKey('A', on_delete=models.CASCADE)
我想实例化它们两个,然后通过以下方式将它们保存到数据库中:
# Code sample 1
a = A()
b = B()
b.a = a
# Do something with b.a, e.g. b.a.some_method()
a.save()
b.save()
尽管a
在b
之前已保存到数据库,因此已经具有ID,但是b.save()
将失败,并显示IntegrityError
:
IntegrityError: null value in column "a_id" violates not-null constraint
DETAIL: Failing row contains (1, null).
作为“替代方法”,可以在调用a
之前将b
分配给b.save()
:
# Code sample 2
a = A()
b = B()
b.a = a
# Do something with b.a, e.g. b.a.some_method()
a.save()
b.a = a
b.save()
这有效,但是似乎不得不将a
分配给b
两次是多余的。感觉b
应该知道a
已更改或已保存到数据库。有没有办法使代码示例1正常工作?
答案 0 :(得分:0)
您不必将a分配给b两次。尝试以下方法:
a = A()
a.save()
b = B()
b.a = a
b.save()
这将起作用,因为仅在调用save()时才分配模型对象的主键。分配外键时,默认情况下使用主键。