Юг: "Бэкэнд базы данных не принимает 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, но не сейчас.