Django创建新记录而不是更新

时间:2017-03-12 15:16:35

标签: django save override

我有以下型号

class FooBar(models.Model):
    FOOBAR_ID = models.AutoField(primary_key=True)
    foo = models.CharField(max_length=255)
    bar = models.CharField(max_length=255)

此外,我创建了一个表单,允许我编辑FooBar的现有实例。我希望在更改foo时更新现有记录,但在更改条形图时创建新记录。

我认为一个好的方法是覆盖保存方法,因为它可以避免对数据库进行额外的查询,我已经通过将以下内容添加到我的FooBar模型中来完成

__original_bar = None

def __init__(self, *args, **kwargs):
    super(FooBar, self).__init__(*args, **kwargs)
    self.__original_bar = self.bar

def save(self, force_insert=False, Force_update=False, *args, **kwargs):
        if self.bar != self.__original_bar:
            super(FooBar, self).save(force_insert=True, force_update=False, *args, **kwargs)
            self.__original_bar= self.bar
        else:
            super(FooBar, self).save(force_insert=False, force_update=True, *args, **kwargs)

当我更新foo时,一切正常,但是当我更新栏时,会显示以下错误:

  

键(“FOOBAR_ID”)=(2)已经存在。

对于force_insert来说,我显然完全错了。如何强制它在保存中创建新记录?

2 个答案:

答案 0 :(得分:1)

您可以将主键设置为None,Django会自动创建新记录。您可以在docs中了解详情。

def save(self, *args, **kwargs):
    if self.bar != self.__original_bar:
        self.FOOBAR_ID = None
        self.__original_bar= self.bar
    super(FooBar, self).save(*args, **kwargs)

答案 1 :(得分:0)

您应该在使用条形图时删除id。在将数据发送到前端之前尝试将其删除。

正在发生的事情是您尝试使用主键“Key(”FOOBAR_ID“)=(2)”添加新行到数据库中。