将 django 模型移动到自己的文件中

Posted

技术标签:

【中文标题】将 django 模型移动到自己的文件中【英文标题】:Moving django models into their own files 【发布时间】:2012-03-08 07:58:21 【问题描述】:

以可维护性的名义,我将一些较大的模型移到了它们自己的文件中。所以在我有这个之前:

app/
  models.py

现在我有了这个:

app/
  models/
    __init__.py
    model_a.py
    model_b.py

这很好用,但是当我使用 manage.py 进行同步数据库时,它不再为这些模型创建表。

我是不是忘记了什么?

谢谢,

【问题讨论】:

app/models/__init__.py 中有什么内容?至少,我认为您需要从子模块中导入实际的模型类(尽管这可能不是最符合 Python 的方法)。 另外,考虑 South 而不是 syncdb。 【参考方案1】:

必须在名为 app.models 的模块中找到模型,其中 app 是应用名称。所以你应该写在app/models/__init__.py文件中

 from model_a import * 
 from model_b import * 

在 Django

注意从 django 1.7 开始,这不是必需的。

此外 ---(这就是我遇到的问题)您必须手动更新模型的 app_label 属性,所以请写:

 __all__ = ["ModelA", "ModelA1"]

 class ModelA(models.Model):
      class Meta: 
          app_label = 'your_app'

如果没有它,django 将错误地设置应用程序。

如果您担心from model_a import * 是邪恶的,您可以在所有模块中设置__all__ 属性。

【讨论】:

最好不要使用... import *,但否则这是可靠的。 :) 我会争辩。如果不将其拆分为子模块,这整个东西将在模型模块中---所以它不会造成伤害,我宁愿在添加新模型后不更改 init.py在 model_a 中(OTOH,如果 OP 每个文件使用单个模型,它不会造成伤害——但我在子模块中总是有多个模型)。我知道 import * 通常是邪恶的,但在这种情况下最好使用它。 不添加 Meta/app_label 有什么故障现象?因为我使用的是 Django 1.6,我自己使用这种方法来拆分模型,还没有看到什么不起作用? 不清楚应该修改哪个 init 文件,一个在模块中还是一个在主项目目录中? 从 Django 1.7 开始,您不再需要担心 Meta 类,因为该问题已得到修复。【参考方案2】:

您需要将每个模型的Meta.app_label 设置为其所属的应用名称,并确保它们是从models/__init__.py 导入的。

您可以在这里查看更多详细信息:https://code.djangoproject.com/wiki/CookBookSplitModelsToFiles

【讨论】:

以上是关于将 django 模型移动到自己的文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中使用 South 将数据从一个模型迁移到另一个模型?

记录历经三天将自己的yolov5模型部署到Android安卓手机

将Django模型从一个应用程序移动到另一个[重复]

Django - 如何将属性移动到另一个模型并删除它

django之 模型层

forms.py 使用 ForeignKey 模型创建表单。商店应该只能将产品添加到自己的商店。 (姜戈)