2011-08-07 8 views
26

モデル例ジャンゴ:get_or_createはtogether_unique

class Example(Stat): 
    numeric = models.IntegerField(...) 
    date = models.DateField(auto_now_add=True,...) #auto_now_add=True was the problem 

    class Meta: 
     unique_together = ('numeric','date') 

と重複するエントリを発生させ)

72の場合と '2011年8月7日' が既に格納されている

Example.object.get_or_create(numeric=72,date='2011-08-07') 

django.db.utils.IntegrityError: (1062, "Duplicate entry '72-2011-08-07' 
を提起します

質問はなぜですかget_or_createは、IntegrityErrorを呼び起こします。これは、 get_or_createというアイディアです。これはバグである場合

わからないが、私はあなたの問題があなたのget_or_createにあなたは含めていない複数の列であるとされ表示されたチケットhttps://code.djangoproject.com/ticket/16587

+0

ご迷惑をおかけして申し訳ございません。 – llazzaro

+0

'get_or_create'と同じEXACT引き数を使って単純に' get'するだけで項目を返すのでしょうか? – agf

答えて

17

を開いて、Djangoのメーリングリストで、すなわちthis threadを参照してください。

あなたはget_or_createを正しく一致させるために、docsで説明したようにget_or_createdefaultsパラメータを使用するか、またはすべての列の値を指定する必要があります。

+1

私はデフォルトの使用が必要ですが、get_or_createの私のパラメータはクラス内のすべてのフィールドが利用可能であることを理解しています。とにかくその情報は多くの助けとなりました。また、私がunique_togetherを削除すると、get_or_createが機能します。 – llazzaro

+0

'get_or_create'も部分的に大文字小文字を区別します。大文字と小文字が異なる場合、一致するものは見つかりませんが、依然として一意制約に当てられます。 – agf

+2

あなたの答えを読んでいる問題を解決しました。 DateFieldはauto_now_add = Trueを使用していたので、私の質問では重要な情報は避けていました。解決するためにauto_now_add = Falseが現在機能しています – llazzaro