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

问题描述 投票:0回答:5

我是 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
python django django-south
5个回答
11
投票

如果在运行

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


3
投票

我没有使用 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()

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


1
投票

很久很久以前,Autofield 出了一个问题。

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

有趣的引言:

答:

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

乙:

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

看起来您在

0
中有
"user"."user_id"

但再次...完整的 StackTrace,请...


0
投票

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


0
投票

“数据库后端不接受 0 作为 AutoField 的值”错误的解决方案

解决方案:检查您的表并在使用models.AutoField(primary_key=True)时启用主键自动增量

对于具有自引用createdBy(外键)的卖家,我也遇到了类似的问题。

之所以遇到这个问题,是因为我在 Seller 类的 django models.py 中使用 models.AutoField(primary_key=True) 。 Django 期望 mysql 数据库自动递增 id 并默认使用 id=0,这是 mysql 不接受的。

并且在mysql中我没有启用自动增量并混淆了django和mysql数据库。

© www.soinside.com 2019 - 2024. All rights reserved.