【问题标题】:south migration: "database backend does not accept 0 as a value for AutoField" (mysql)南迁移:“数据库后端不接受 0 作为 AutoField 的值”(mysql)
【发布时间】:2013-12-18 04:43:43
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个数据库?
  • Full StackTrace,请... + 哪个版本。你用的django、south和mysql的?
  • @Adrián:我也有同样的问题。你找到解决办法了吗?

标签: python django django-south


【解决方案1】:

如果在您运行manage.py migrate(或旧版本中的manage.py syncdb)时发生这种情况,原因可能是您尝试将外键添加到使用 AutoField 作为其主键的模型中,并使用 0 作为默认值。 编辑迁移文件并删除 AddField 操作中的参数 default=0 它适用于我在 Django 1.10 中。

【讨论】:

    【解决方案2】:

    我没有使用 South,但我最近从 Django 1.4 升级到了 1.6(两者都使用 MySQL 作为数据库后端),并且在尝试保存某些模型时得到了相同的 ValueError。我将其追踪到一个递归外键字段。所以我有:

    class Foo(models.Model):
        ...
        duplicate = models.ForeignKey('self', blank=True, null=True)
        ...
    

    在某个地方——不幸的是,我不确定在哪里——我的许多对象在duplicate_id 中获得了0 的值。

    >>> 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()
    

    如果这给出非零结果,则可能需要修复该字段。

    【讨论】:

    • 是的。正是我的问题。很奇怪,谁知道那已经存在了多久。
    • 确实很难追踪!
    • 哇,这也解决了我的问题!
    【解决方案3】:

    很久很久以前,Autofield 有一个问题。

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

    一个有趣的报价:

    答:

    您似乎正在尝试将 0 保存到指向 自动场。但是,这是非法的,因为 AutoField 不会接受 值,因此 ForeignKey 也不能保存该值。

    乙:

    因此,当您需要能够接受时,此修复会产生另一个问题 值 0(或者如果您正在处理已经具有值的数据库 0!)在自动字段中。就我而言,我需要接受一个零 ID,所以 我的外键可以指向零,以便唯一约束可以 正常工作。

    您在"user"."user_id" 中似乎有0
    但是再次......请完整堆栈跟踪......

    【讨论】:

      【解决方案4】:

      升级到 django 1.7.1 后出现同样的错误 这是在将具有外键的模型保存到另一个模型时引起的,由于某种原因,该模型的 id 从 0 开始自动递增,我想这在以前的 django 版本中是允许的,但现在不是。

      【讨论】:

        猜你喜欢
        • 2019-07-19
        • 2019-06-12
        • 2018-08-16
        • 2014-07-30
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 2014-05-29
        • 2012-09-08
        相关资源
        最近更新 更多