我是 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 作为主键的模型添加外键,并使用 0 作为默认值价值。 编辑迁移文件并删除 AddField 操作中的参数 default=0
。它在 Django 1.10 中对我有用。
我没有使用 South,但我最近从 Django 1.4 升级到 1.6(两者都使用 MySQL 作为数据库后端),并且在尝试保存某些模型时得到相同的
ValueError
。 我追踪到一个递归外键字段。 所以我有:
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
因为此特定错误不会将您指向导致问题的特定字段,所以通常您可以检查外键字段
fieldname
是否具有任何 0
值:
>>> Foo.objects.filter(fieldname_id=0).count()
如果这给出非零结果,则该字段可能需要修复。
很久很久以前,Autofield 出了一个问题。
https://code.djangoproject.com/ticket/17653
有趣的引言:
答:
您似乎正在尝试将 0 保存到指向一个外键 自动字段。但是,这是非法的,因为 AutoField 不会接受 值,因此外键也不能保存该值。
乙:
因此,当您需要能够接受时,此修复程序会产生另一个问题 值为 0(或者如果您正在处理的数据库已经具有值 0!)在自动字段中。就我而言,我需要接受 ID 为零,所以 我的外键可以指向零,这样唯一的约束就可以 工作正常。
看起来您在
0
中有 "user"."user_id"
。升级到 django 1.7.1 后我遇到了同样的错误 这是在保存一个具有外键的模型到另一个模型时引起的,由于某种原因,该模型的 id 从 0 开始自动递增,我想这在以前的 django 版本中是允许的,但现在不允许。
解决方案:检查您的表并在使用models.AutoField(primary_key=True)时启用主键自动增量
对于具有自引用createdBy(外键)的卖家,我也遇到了类似的问题。
之所以遇到这个问题,是因为我在 Seller 类的 django models.py 中使用 models.AutoField(primary_key=True) 。 Django 期望 mysql 数据库自动递增 id 并默认使用 id=0,这是 mysql 不接受的。
并且在mysql中我没有启用自动增量并混淆了django和mysql数据库。