发布于 2026-01-06 12 阅读
0

创建基于现有数据库的 Django 模型 数据库设置 Django inspectdb 命令 inspectdb 的更多选项 注意事项 这是一个自动生成的 Django 模型模块。您需要手动执行以下操作来清理它: * 重新排列模型的顺序 * 确保每个模型都有一个 primary_key=True 的字段 * 确保每个 ForeignKey 的 on_delete 属性都设置为所需的行为。 * 如果您希望允许 Django 创建、修改和删除表,请删除 managed = False 的行。您可以随意重命名模型,但不要重命名 db_table 的值或字段名称。

创建现有数据库的 Django 模型

数据库设置

Django inspectdb 命令

inspectdb 的更多选项

要点回顾

这是一个自动生成的 Django 模型模块。

您需要手动执行以下操作来清理此问题:

* 重新排列模型顺序

* 确保每个模型都有一个 primary_key=True 的字段

* 确保每个外键都已on_delete设置为所需的行为。

*managed = False如果您希望允许 Django 创建、修改和删除表,请删除以下行。

您可以随意重命名模型,但不要重命名数据库表的值或字段名称。

Django 以其高效的 ORM 功能而闻名。我们经常会遇到需要将现有数据库集成到新的后端框架的情况。而实现这一目标的第一步通常是(对于支持 ORM 的框架而言)创建数据库模型。本文将介绍如何创建现有数据库的 Django 模型。

数据库设置

将 Django 集成到旧数据库中是完全可行的。第一步是在配置文件中设置 Django 与现有数据库的连接settings.py

Django inspectdb 命令

在 Django 中设置好数据库连接后,就可以自动生成模型了。没错,你没听错!Django 提供了一个实用工具,可以通过inspectdb命令行从现有数据库自动生成模型。

您可以通过执行以下命令,利用内省功能创建现有数据库模型:

$ python manage.py inspectdb
Enter fullscreen mode Exit fullscreen mode

上述命令会将 Django 可以根据现有数据库创建的所有模型输出到标准输出(stdout)。您可以使用标准的 Unix 输出重定向将其保存为文件:

$ python manage.py inspectdb > models.py
Enter fullscreen mode Exit fullscreen mode

输出文件将保存到当前目录。将该文件移动到正确的应用程序中,即可以此为基础进行进一步的自定义。

请记住:运行 `inspect db` 命令之前,需要先运行 Django 项目。

inspectdb 的更多选项

inspectdb默认情况下,不带任何参数的命令会输出数据库中的所有表。如果要查看特定的表,可以在命令后以空格分隔的方式传递表名作为参数:

$ python manage.py inspectdb table1 table2
Enter fullscreen mode Exit fullscreen mode

您可以参考 Django文档了解更多信息。

要点回顾

  • 如果inspectdb无法将列的类型映射到模型字段类型,则会使用TextField 类型,并在生成的模型中该字段旁边插入 Python 注释'This field type is a guess.'。请注意这一点,并根据需要更改字段类型。
  • 如果数据库列名是 Python 保留字(例如pass`__name__`、class`__name__` 或 `__name__` for),inspectdb则会'_field'在属性名后附加 `__name__` 并将该db_column属性设置为实际的字段名(例如 `__name__`、pass` class__name__` 或 ` __name__` for)。
    例如,如果一个表有一个INT名为 `__name__` 的列for,则生成的模型将有一个如下所示的字段:

    for_field = models.IntegerField(db_column='for')

    inspectdb'Field renamed because it was a Python reserved word.'将在字段旁边插入 Python 注释。

  • 如果您的数据库包含引用其他表的表(大多数数据库都是如此),您可能需要重新排列生成的模型的顺序,以便正确排序引用其他模型的模型。

  • defaults当模型字段指定默认值时,Django 不会创建数据库。同样,数据库默认值也不会被转换为模型字段默认值,也不会被以任何方式检测到inspectdb

  • 默认情况下,inspectdb`creates` 会创建表unmanaged models。也就是说,managed = False在模型Meta类中,`is` 会告诉 Django 不要管理每个表的创建、修改和删除。如果您确实希望 Django 管理表的生命周期,则需要将 `is` 选项更改managedTrue`true`(或者直接删除它,因为 `true` 是其默认值)。

  • 每个数据库表都会被转换为一个模型类(即,数据库表和模型类之间存在一对一的映射关系)。这意味着您需要将任何多对多连接表的模型重构为ManyToManyField对象。

  • 外键检测仅适用于 PostgreSQL 和某些类型的 MySQL 表。在其他情况下,外键字段将按如下方式生成:

    IntegerField's, assuming the foreign-key column was anINT柱子。

此功能旨在提供快捷方式,而非生成最终模型。运行后,您需要自行查看生成的模型并进行自定义。

文章来源:https://dev.to/idrisrampurawala/creating-django-models-of-an-existing-db-288m