保存模型尝试创建新对象

时间:2017-06-15 14:50:31

标签: python django model

我有以下两个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时间戳的功能。

1 个答案:

答案 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