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

don*_*ior 7 mysql django django-models python-3.x

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

python manage.py inspectdb > myapp/models.py
Run Code Online (Sandbox Code Playgroud)

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

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

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

当前设置

  • Python版本:3.6.8
  • Django 版本:2.2.5
  • mysql客户端:1.4.4
  • sqlparse: 0.3.0

Wil*_*sem 8

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

没有。如果您没有在模型中指定主键。Django 会自动将一个AutoField名为 的模型添加到您的模型中id,如关于自动主键字段的文档所述

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

id = models.AutoField(primary_key=True)
Run Code Online (Sandbox Code Playgroud)

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

如果您想指定自定义主键,请primary_key=True在您的字段之一上指定 。如果 Django 发现您已明确设置Field.primary_key,则不会添加自动id 列。

  • 让我感到困惑的是 `inspectdb` 添加的注释:“确保每个模型都有一个primary_key=True 的字段”,对于 django 新手来说,这似乎表明了其他内容。这个答案很好地澄清了这一点。 (2认同)