南迁:“数据库后端不接受0作为AutoField的值”(mysql)

时间:2013-12-02 12:55:53

标签: python django django-south

我是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

4 个答案:

答案 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版本中是允许的,但现在不允许。