【问题标题】:model instance exists but is "saved" anyway模型实例存在但无论如何都“保存”了
【发布时间】:2013-09-26 01:39:09
【问题描述】:

当我调用save 方法时,我的实例似乎被保存了。问题:我的数据库中已经存在该实例!

我的模特:

class DosIdModel(models.Model):
    dosId = models.IntegerField(max_length=7, primary_key=True)
    proposOrigine = models.CharField(max_length=4)
    proposAnnee = models.IntegerField(max_length=4)
    proposChrono = models.CharField(max_length=7)
    splitNumber = models.IntegerField(max_length=1, blank=True, null=True, default=None)

我的看法:

instance = DosIdModel()
instance.dosId=int(row[0])
instance.proposOrigine=row[1].strip()
instance.proposAnnee=int(row[2])
instance.proposChrono=row[3].strip()
instance.splitNumber=emptyOrVar(row[4], "int")
msg=(instance.dosId)

savedList=[]
errors_list=[]
try:
    print "exist: ", DosIdModel.objects.get(dosId=instance.dosId).dosId
    instance.save()
    print "saved"
    savedList.append(msg)
    print "end try"
except IntegrityError, e:
    print "except"
    error= "The row " + str(msg) + " already exists!!"

控制台中的结果:

exist:  104486
saved
end try

怎么了?

【问题讨论】:

  • 抱歉,不知道该代码 sn-p 试图演示什么。
  • 为什么会出现这个问题?显然已经有一个相同的dosId 记录。所以.save() 只会更新该记录。
  • 如果您正在处理来自表单的数据,您最好使用集成表单...
  • 我认为save 方法仅适用于INSERT 查询。我将此代码与其他模型一起使用,如果对象已经存在,它会抛出 IntegrityError。正如Kevin所指出的,原因可能是我没有在我的其他模型中声明primary key(我使用Django创建的auto primary key)。
  • 所以我最终使用了force_insert=True(我不想使用update,只想使用insert)。

标签: django model save instance


【解决方案1】:

查看How Django knows to UPDATE vs. INSERT 上的文档。具体来说:

如果对象的主键属性设置为计算结果为 True 的值... Django 执行一个 SELECT 查询来确定一条记录是否与给定的主 密钥已经存在。如果具有给定主键的记录已经存在,Django 执行一个 UPDATE 查询......这里的一个问题是你应该小心不要 如果不能保证,在保存新对象时显式指定主键值 主键值未使用。

您可以通过使用 instance.save(force_insert=True) 来获得您正在寻找的行为——这将强制 INSERT 反过来应该提高您所期望的 IntegrityError

但是,请注意,您是在违背常规。以下是文档对force_insert 的评价:

您很少需要使用这些参数。 Django 几乎会 总是做正确的事并试图覆盖这将导致错误 难以追查。此功能仅供高级使用。

【讨论】:

  • 确实,我误解了save 方法。我将此代码用于许多具有不同uniqueness 约束的模型,所以我最终使用force_insert=True。似乎工作:)。谢谢
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2018-11-22
  • 2018-03-21
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多