id 主键是不是必须在从 inspectdb 针对现有数据库生成的 Django 模型中显式定义?

Posted

技术标签:

【中文标题】id 主键是不是必须在从 inspectdb 针对现有数据库生成的 Django 模型中显式定义?【英文标题】:Do id primary key have to be explicitly defined in Django models generated from inspectdb against an existing database?id 主键是否必须在从 inspectdb 针对现有数据库生成的 Django 模型中显式定义? 【发布时间】:2020-02-01 16:42:41 【问题描述】:

我有一个现有的 mysql 数据库,其中有几个表已经填充了数据。我使用应用程序创建并配置了一个 Django 项目。 Django 和数据库之间的通信按预期工作。我使用“inspectdb”命令生成了一个“models.py”来创建我所有的应用程序模型:

python manage.py inspectdb > myapp/models.py

我的问题是我的模型都没有在“models.py”中显示任何“id”字段。所有现有的 MySQL 表都有一个“id”列作为主键(为这些表启用了自动增量),这看起来很奇怪。

我想知道是否需要在使用 inspectdb 创建的所有模型类中显式添加“id”主键字段,或者是否不需要(在这种情况下将是隐式的)。

为什么 Django 模型定义中缺少“id”主键,我应该将此字段添加到模型类中吗?

当前设置

Python 版本:3.6.8 Django 版本:2.2.5 mysqlclient:1.4.4 sqlparse: 0.3.0

【问题讨论】:

【参考方案1】:

为什么 Django 模型定义中缺少 'id' 主键,我应该将此字段添加到模型类中吗?

。如果您没有在模型中指定主键。 Django 将自动AutoField 添加到名为id 的模型中,如the documentation on Automatic primary key fields 中所指定:

默认情况下,Django 为每个模型提供以下字段

id = models.AutoField(primary_key=True)

这是一个自动递增的主键。

如果您想指定自定义主键,请指定 primary_key=True 在您的一个字段上。如果 Django 看到你 显式设置Field.primary_key,它不会自动添加id 列。

【讨论】:

我感到困惑的是inspectdb添加的评论:“确保每个模型都有一个primary_key = True的字段”,对于django新手来说,这似乎表明了其他东西。这个答案很好地解决了这个问题。【参考方案2】:

我也有同样的情况。不同之处在于我是从 mssql 数据库迁移的。正如@williem 所提到的,Django 会自动分配一个“id”。使用 ForeignKey 关系时,您更有可能遇到编程错误,因为主键可能会发生冲突。在这种情况下,您可能会发现这很有用: [Django Programming error column does not exist even after running migrations

【讨论】:

以上是关于id 主键是不是必须在从 inspectdb 针对现有数据库生成的 Django 模型中显式定义?的主要内容,如果未能解决你的问题,请参考以下文章

sql(sqlserver) join 的表是否必须有主键?

如何在 C# Web API 中加入两个表

ThinkPHP中查询数据库where()中的条件必须包含主键值吗

GeoDjango inspectdb 与多个数据库

如何在从另一个表中提取数据时创建具有约束的表

jfinal操作数据库使用findById方法时,表的主键字段必须是id么