【问题标题】:Django ORM cannot auto set primary key for model after loading data from legacy db从遗留数据库加载数据后,Django ORM 无法自动设置模型的主键
【发布时间】:2016-07-25 00:19:14
【问题描述】:

我正在处理一个需要从旧数据库加载数据的新 Django 项目,但在我从旧数据库加载数据后,保存新模型对象总是失败并显示 IntegrityError: null value in column "id" violates not-null constraint

旧数据库中的主键在 10000 到 200000 之间,新数据库是 Postgres 9.5,从不手动设置 SQL 架构。

我的模型可能很简单:

class MyModel(Model):
    id = IntegerField(primary_key=True)

当我运行 MyModel().save()MyModel.create() 时,这将失败。可以像我在加载数据时使用的那样运行MyModel(id=233).save()

我猜是因为它不知道从哪里开始自动生成主键。如何解决这个问题?

【问题讨论】:

    标签: django postgresql django-models django-orm


    【解决方案1】:

    要在 django 中添加自增字段,您应该使用 AutoField

    您应该像这样定义您的 id 字段:

    id = models.AutoField(primary_key=True)
    

    如果您想将其命名为id,则无需定义字段,django 会为您完成。

    没有显式 id 字段的模型仍会将 AutoField id 作为主键。

    【讨论】:

    • 迁移后,这行得通。但是文档说这是默认行为,这是否意味着我不需要手动定义id 字段?
    • 再问一个问题,如果我要keyid从300000开始,怎么办?
    • 是的,django 默认添加了idAutoField。如果您想将其命名为id,则无需手动添加。
    • 您可以在数据库级别进行更改。见:stackoverflow.com/questions/117800/…
    • Emm,最好将它添加到迁移文件中,这样我团队中的每个开发人员都会得到方便。真的很有帮助,谢谢!
    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 2016-02-15
    • 2017-03-19
    • 1970-01-01
    • 2017-06-10
    • 2020-03-14
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多