将 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 将数据从一个模型迁移到另一个模型?