我有以下两个Django模型:
class A:
uuid = CharField(primary_key=True)
code = CharField(unique=True)
class B:
uuid = CharField(primary_key=True)
a = ForeignKey(A, related_name='bs')
def save(**kwargs):
self.a.save(**kwargs)
super(B, self).save(**kwargs)
如果我想在测试用例中使用它们并编写此函数:
def setUp():
a = A.objects.create(uuid='a')
b = B.objects.create(uuid='b', a=a)
我收到以下错误:
UNIQUE constraint failed: app_name_a.code
看起来在B的save方法中,它尝试创建具有相同值的另一个A,而不是更新现有实例。为什么会这样?我使用的是Python 3.5和Django 1.8.14。
顺便说一句:我想保存父级的原因是我在save方法中有更新updated_at
时间戳的功能。
答案 0 :(得分:1)
问题发生在您kwargs
传递给A.save()
:
self.a.save(**kwargs)
如果您查看documentation,则会看到force_insert
已发送True
(因为此时正在创建A
)< / em>当您尝试保存B
时,Django无法检查是否已创建self.a
因为您将force_insert
作为True
传递给{{1}同样。
要解决此问题,您不应传递self.a.save()
,以便让Django决定创建或更新**kwargs
:
self.a