Djangoを初めて使用し、担当者とレポーターの外部キーをユーザーに戻そうとしています。しかし、Southで変更を適用しようとすると、エラーが発生します。
ValueError: The database backend does not accept 0 as a value for AutoField.
私のモデルコード:
class Ticket(models.Model):
title = models.CharField(max_length=80)
text = models.TextField(blank=True)
prioritys = models.ForeignKey(Prioritys)
ticket_created = models.DateTimeField(auto_now_add=True)
ticket_updated = models.DateTimeField(auto_now=True)
assignee = models.ForeignKey(User, null=True, related_name='assignee')
reporter = models.ForeignKey(User, null=True, related_name='reporter')
def escaped_text(self):
return markdown.markdown(self.text)
def __unicode__(self):
return self.text
manage.py migrate
(または古いバージョンではmanage.py syncdb
)を実行したときにこれが発生する場合は、AutoFieldを主キーとして使用するモデルに外部キーを追加しようとしたためである可能性があります。デフォルト値として。 移行ファイルを編集し、AddField操作で引数default=0
を削除します。 Django 1.10で機能します。
私はSouthを使用していませんでしたが、最近Django 1.4から1.6(両方のdbバックエンドとしてMySQLを使用)にアップグレードし、保存しようとすると同じValueError
を取得していましたいくつかのモデル。再帰的なForeignKeyであるフィールドまで追跡しました。
class Foo(models.Model):
...
duplicate = models.ForeignKey('self', blank=True, null=True)
...
どこかで(残念ながらどこにあるのかわかりませんが)、私のオブジェクトの多くは0
に対してduplicate_id
の値を取得していました。
>>> Foo.objects.filter(duplicate_id=0).count()
2078
これは、他のForeignKey
フィールドでは発生せず、自己参照フィールドでのみ発生しました。そこで、そのフィールドの値をNone
に戻しました。これにより、エラーが修正されました。
>>> Foo.objects.filter(duplicate_id=0).update(duplicate=None)
2078L
この特定のエラーは、問題を引き起こしている特定のフィールドを示していないため、通常、ForeignKeyフィールドfieldname
に0
値があるかどうかを確認できます。
>>> Foo.objects.filter(fieldname_id=0).count()
これでゼロ以外の結果が得られる場合は、そのフィールドを修正する必要があります。
ずっと昔、オートフィールドに問題がありました。
https://code.djangoproject.com/ticket/1765
興味深い引用:
A:
AutoFieldを指すForeignKeyに0を保存しようとしているようです。ただし、AutoFieldはその値を受け入れないため、ForeignKeyもその値を保持できないため、これは違法です。
B:
したがって、この修正により、オートフィールドで値0を受け入れる必要がある場合(または、すでに値が0になっているDBで作業している場合)に別の問題が発生します。私の場合、一意制約が正しく機能するように外部キーがゼロを指すことができるように、ゼロのIDを受け入れる必要があります。
0
に"user"."user_id"
があるようです。
しかし、もう一度...フルStackTraceをお願いします...
Django 1.7.1にアップグレードした後、同じエラーが発生しました。外部キーを持つモデルを別のモデルに保存したときに、何らかの理由でIDが0から始まる自動インクリメントがあったために発生しました。これは以前のDjangoバージョンでは許可されていましたが、現在は許可されていないと思います。