【问题标题】:Why is unmanaged model not calculating id in Django?为什么非托管模型不计算 Django 中的 id?
【发布时间】:2021-10-21 15:16:42
【问题描述】:

我在 Django 中有一个非托管模型:

class Person(models.Person):
    
    name = models.CharField(max_length=200)

    class Meta:
        managed = False
        db_table = '"public"."person"'

在我的测试中,我尝试在数据库中创建一个 Person 条目:

person = Person(name="Ariel")
person.save()

然后我得到一个错误:

django.db.utils.IntegrityError: null value in column "id" of relation "person" violates not-null constraint
DETAIL:  Failing row contains (null, Ariel).

外部测试,一切正常。在测试中,我通过加载模式转储使用非托管对象引用的表来初始化数据库。

Django docs 声明“不会对此模型执行任何数据库表创建、修改或删除操作”,并且“模型处理的所有其他方面与正常情况完全相同”,包括“添加一个如果你不声明它,模型的自动主键字段”。但这不意味着这段代码应该可以工作吗?为什么 Django 和 Postgres 不处理 id?难道我做错了什么?我该如何解决?

【问题讨论】:

  • 您需要在模型中声明id 字段,例如id=models.AutoField(primary_key=True)

标签: django postgresql


【解决方案1】:

当然,您遇到的问题是在您的 PostgreSQL 表中,id 不是自动增量字段,默认情况下它为空。

在 Django 上使用非托管模型时,这是一个很常见的问题。您需要涵盖正在使用的表格的各个方面。

【讨论】:

  • 嗯,就是这样,我在测试中加载的模式转储将id 声明为自动增量字段。它是我在本地使用的数据库的转储,当我手动测试时它可以工作。那么为什么它在测试中不起作用?
  • 在这种情况下,我会将id = models.AutoField(primary_key=True) 添加为 Person 模型中的第一个字段。
猜你喜欢
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2014-12-24
  • 2012-04-14
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多