我有以下型号
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来说,我显然完全错了。如何强制它在保存中创建新记录?
答案 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)”添加新行到数据库中。