web-dev-qa-db-ja.com

南移行:「データベースバックエンドはAutoFieldの値として0を受け入れません」(mysql)

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
20
user968808

manage.py migrate(または古いバージョンではmanage.py syncdb)を実行したときにこれが発生する場合は、AutoFieldを主キーとして使用するモデルに外部キーを追加しようとしたためである可能性があります。デフォルト値として。 移行ファイルを編集し、AddField操作で引数default=0を削除します。 Django 1.10で機能します。

6
Craynic Cai

私は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フィールドfieldname0値があるかどうかを確認できます。

>>> Foo.objects.filter(fieldname_id=0).count()

これでゼロ以外の結果が得られる場合は、そのフィールドを修正する必要があります。

3
Dan Russell

ずっと昔、オートフィールドに問題がありました。

https://code.djangoproject.com/ticket/1765

興味深い引用:

A:

AutoFieldを指すForeignKeyに0を保存しようとしているようです。ただし、AutoFieldはその値を受け入れないため、ForeignKeyもその値を保持できないため、これは違法です。

B:

したがって、この修正により、オートフィールドで値0を受け入れる必要がある場合(または、すでに値が0になっているDBで作業している場合)に別の問題が発生します。私の場合、一意制約が正しく機能するように外部キーがゼロを指すことができるように、ゼロのIDを受け入れる必要があります。

0"user"."user_id"があるようです。
しかし、もう一度...フルStackTraceをお願いします...

1
akaRem

Django 1.7.1にアップグレードした後、同じエラーが発生しました。外部キーを持つモデルを別のモデルに保存したときに、何らかの理由でIDが0から始まる自動インクリメントがあったために発生しました。これは以前のDjangoバージョンでは許可されていましたが、現在は許可されていないと思います。

0
uri.lazar