我是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
答案 0 :(得分:6)
如果在旧版本中运行manage.py migrate
(或manage.py syncdb
)时发生这种情况,原因可能是您尝试将外键添加到使用AutoField作为其主键的模型中,并使用0作为默认值。 编辑迁移文件并删除AddField操作中的参数default=0
。它适用于Django 1.10。
答案 1 :(得分:3)
我没有使用South,但我最近从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 :(得分:1)
很久以前,Autofield出现了问题。
https://code.djangoproject.com/ticket/17653
一个有趣的引语:
A:
看来你正试图将0保存到指向一个的ForeignKey 下拉列表AutoField。但是,这是非法的,因为AutoField不接受这一点 值,因此ForeignKey也不能保持该值。
B:
因此,当您需要接受时,此修复会产生另一个问题 值为0(或者如果您正在处理已具有值的数据库 在自动现场中的0!)就我而言,我需要接受一个零的ID 我的外键可以指向零,以便唯一约束可以 工作正常。
您似乎0
中有"user"."user_id"
但是再次...... Full StackTrace,请...
答案 3 :(得分:0)
升级到django 1.7.1后,我遇到了同样的错误 它是在将具有外键的模型保存到另一个模型时导致的,由于某种原因,该模型的id开始自动增量为0,我想这在以前的django版本中是允许的,但现在不允许。