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 クエリを実行します....ここでの 1 つの問題は、新しいオブジェクトを保存するときに主キーの値を明示的に指定しないように注意する必要があることです。主キー値は未使用です。

を使用して、探している動作を取得できます。instance.save(force_insert=True)これにより、INSERT が強制され、IntegrityError予想される が発生します。

ただし、あなたは穀物に逆らっていることに注意してください。ドキュメントの内容はforce_insert次のとおりです。

これらのパラメーターを使用する必要があることは非常にまれです。Django はほとんどの場合正しいことを行い、それをオーバーライドしようとすると、追跡が困難なエラーが発生します。この機能は高度な使用のみを目的としています。

于 2013-09-20T18:16:46.603 に答える