模型实例存在但无论如何都“保存”了

时间:2013-09-20 15:35:23

标签: django model save instance

当我调用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

有什么问题?

1 个答案:

答案 0 :(得分:1)

查看How Django knows to UPDATE vs. INSERT上的文档。具体做法是:

  

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

您可以使用instance.save(force_insert=True)来获取您正在寻找的行为 - 这会强制INSERT反过来提升您期望的IntegrityError

然而,请注意,你要反对谷物。以下是文档对force_insert所说的内容:

  

您需要使用这些参数的情况非常罕见。 Django差不多了   总是做正确的事情并试图覆盖它会导致错误   难以追查。此功能仅供高级用途使用。