Django / PostgreSQL - 只包含外键的模型

4

我有一个这样的模型:

class InputTypeMap(models.Model):
    input_type = models.ForeignKey(InputType, on_delete=models.CASCADE)
    training = models.ForeignKey(Training, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    gender = models.ForeignKey(Gender, on_delete=models.CASCADE)

当我尝试使用以下方式创建此模型的实例时:

InputTypeMap.objects.create(input_type=input_type,
                            training=training,
                            gender=gender,
                            category=category)

我遇到了一个异常

Traceback (most recent call last):
  File "/home/hove/sleipner/venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.NotNullViolation: null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, Maintenance, Female, MareGielding, No).

从错误信息看,似乎是新条目的ID键没有生成。

这段代码一直能正常工作,但“突然”在本地失败了——可能是在执行apt get upgrade之后。当我使用sqlite或Postgres-10.14运行相同的代码时,事情仍然像以前一样正常工作。目前还不清楚这是我的代码(最有可能......)、Django还是Postgres的一个bug。我正在使用Django版本3.1.2。

我使用的Postgres服务器版本是9.6。


这个 id 字段很可能是主键的一部分,而且它们不能为 NULL。从来没有过。 - wildplasser
1
是的 - ID键是主键;由于我尚未将其添加到模型中,因此应该自动创建和填充 - 我想是这样的? - user422005
只有在调用者省略它或将DEFAULT作为提供给它时才会生成它。 - wildplasser
你能提供一个Git仓库吗?如果没有最小可重现示例,这将很难调试。 - Lord Elrond
你在升级系统后是否运行了 ./manage.py migrate 命令? - pbacterio
显示剩余3条评论
2个回答

1
很可能这是一个主键问题,在我的情况下,我向我的模型添加了类似以下的内容:
person_id = models.AutoField(primary_key=True)

适应我的观点,它解决了这个问题。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接