Юг: "Бэкэнд базы данных не принимает 0 в качестве значения для AutoField" (mysql)

Я новичок в django и пытаюсь вернуть внешний ключ к пользователям для цессионария и репортера. Но когда я пытаюсь применить изменение с Югом, я получаю ошибку

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

Ответы

Ответ 1

Я не использовал Юг, но недавно обновился с Django 1.4 до 1.6 (с MySQL как db-бэкэнд для обоих) и получал тот же 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()

Если это дает ненулевой результат, возможно, это поле должно быть исправлено.

Ответ 2

Долгое время была проблема с Autofield.

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

интересные цитаты:

А:

Кажется, вы пытаетесь сохранить 0 в ForeignKey, который указывает на AutoField. Но это незаконно, поскольку AutoField не согласится с тем, что значение, и поэтому ForeignKey не может удерживать это значение.

В:

Итак, это исправление создает еще одну проблему, когда вам нужно принять значение 0 (или если вы работаете над БД, которая уже имеет значение 0!) в автополе. В моем случае мне нужно принять идентификатор нуль, так что что мой внешний ключ может указывать на ноль, так что уникальное ограничение может правильно работать.

Похоже, у вас есть 0 в "user"."user_id".
Но опять... Полный StackTrace, пожалуйста...

Ответ 3

Если это происходит при запуске manage.py migrate (или manage.py syncdb в старых версиях), возможно, причина в том, что вы пытались добавить внешний ключ к модели, которая использует AutoField в качестве своего первичного ключа и использует 0 как значение по умолчанию. Отредактируйте файл миграции и удалите аргумент default=0 в операциях AddField. Он работает для меня в Django 1.10.

Ответ 4

Я получил ту же ошибку после обновления до django 1.7.1 он был вызван при сохранении модели с внешним ключом для другой модели, которая по какой-то причине имела идентификатор, начинающий автоинкремент с 0, я предполагаю, что это было разрешено в предыдущих версиях django, но не сейчас.