0

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

怎么了?

4

1 回答 1

2

查看有关Django 如何知道 UPDATE 与 INSERT的文档。具体来说:

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

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

但是请注意,您是在违背常规。这是文档所说的force_insert

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

于 2013-09-20T18:16:46.603 回答