我正在尝试将我的应用的 models.py
拆分为几个文件:
我的第一个猜测是这样做:
myproject/
settings.py
manage.py
urls.py
__init__.py
app1/
views.py
__init__.py
models/
__init__.py
model1.py
model2.py
app2/
views.py
__init__.py
models/
__init__.py
model3.py
model4.py
这不起作用,然后我找到了 this,但在这个解决方案中我仍然遇到问题,当我运行 python manage.py sqlall app1
时,我得到了类似的东西:
BEGIN;
CREATE TABLE "product_product" (
"id" serial NOT NULL PRIMARY KEY,
"store_id" integer NOT NULL
)
;
-- The following references should be added but depend on non-existent tables:
-- ALTER TABLE "product_product" ADD CONSTRAINT "store_id_refs_id_3e117eef" FOREIGN KEY ("store_id") REFERENCES "store_store" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "product_product_store_id" ON "product_product" ("store_id");
COMMIT;
我不太确定这一点,但我担心 The following references should be added but depend on non-existent tables:
部分
这是我的 model1.py 文件:
from django.db import models
class Store(models.Model):
class Meta:
app_label = "store"
这是我的 model3.py 文件:
from django.db import models
from store.models import Store
class Product(models.Model):
store = models.ForeignKey(Store)
class Meta:
app_label = "product"
显然有效,但我在 alter table
中得到了评论,如果我尝试这个,同样的事情会发生:
class Product(models.Model):
store = models.ForeignKey('store.Store')
class Meta:
app_label = "product"
那么,我应该手动运行 alter for references 吗?这可能会给我带来南方的问题吗?
from app1.models.model1 import Store
,模型 3 会发生什么?
对于 Django 1.9 上的任何人,现在框架都支持它,而无需定义类元数据。
https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package
注意:对于 Django 2,it's still the same
manage.py startapp 命令创建一个包含 models.py 文件的应用程序结构。如果您有许多模型,将它们组织在单独的文件中可能会很有用。为此,请创建一个模型包。删除 models.py 并使用 __init__.py 文件和用于存储模型的文件创建一个 myapp/models/ 目录。您必须在 __init__.py 文件中导入模型。
所以,在你的情况下,对于像这样的结构
app1/
views.py
__init__.py
models/
__init__.py
model1.py
model2.py
app2/
views.py
__init__.py
models/
__init__.py
model3.py
model4.py
你只需要做
#myproject/app1/models/__init__.py:
from .model1 import Model1
from .model2 import Model2
#myproject/app2/models/__init__.py:
from .model3 import Model3
from .model4 import Model4
反对导入所有类的注意事项:
显式导入每个模型而不是使用 from .models import * 具有不使命名空间混乱、使代码更具可读性以及保持代码分析工具有用的优点。
我会做以下事情:
myproject/
...
app1/
views.py
__init__.py
models.py
submodels/
__init__.py
model1.py
model2.py
app2/
views.py
__init__.py
models.py
submodels/
__init__.py
model3.py
model4.py
然后
#myproject/app1/models.py:
from submodels/model1.py import *
from submodels/model2.py import *
#myproject/app2/models.py:
from submodels/model3.py import *
from submodels/model4.py import *
但是,如果你没有充分的理由,将model1和model2直接放在app1/models.py中,将model3和model4放在app2/models.py中
- -第二部分 - -
这是 app1/submodels/model1.py 文件:
from django.db import models
class Store(models.Model):
class Meta:
app_label = "store"
因此更正您的 model3.py 文件:
from django.db import models
from app1.models import Store
class Product(models.Model):
store = models.ForeignKey(Store)
class Meta:
app_label = "product"
已编辑,以防有人再次出现此问题:查看 django-schedule 以获取执行此操作的项目示例。 https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/
from product.models import Product
的内容时,我遇到了另一个问题:ImportError: No module named models
models.py
文件的大小。当我的代码增长到超过 15k 行时,我最近这样做了。不过写的很棒。这个过程相当简单。主要的警告是你必须记住定义一个显式的 app_label,因为 Django 默认从直接模块中提取它。
__init__.py
,一切似乎都正常。我不必更正我的模型文件。我能够从 shell 和 django 管理员获取和创建对象。我已经尝试 django 一周了,所以我想知道最新版本现在是否允许这种情况发生?
我实际上遇到了一个关于你所问的教程,你可以在这里查看:
http://paltman.com/breaking-apart-models-in-django/
一个可能相关的关键点 - 您可能希望使用 Meta 类上的 db_table 字段将重定位的类指向它们自己的表。
我可以确认这种方法在 Django 1.3 中有效
Django 3 的相关链接是:
https://docs.djangoproject.com/en/3.2/topics/db/models/#organizing-models-in-a-package
指向先前版本文档的链接已损坏。那里的例子非常简洁:
为此,请创建一个模型包。删除 models.py 并使用 init.py 文件和用于存储模型的文件创建一个 myapp/models/ 目录。您必须在 init.py 文件中导入模型。
例如,如果您在模型目录中有 Organic.py 和 Synthetic.py:
from .organic import Person
from .synthetic import Robot
最简单的步骤:
在您的应用程序中创建模型文件夹(文件夹名称应为模型)从应用程序目录中删除model.py文件(删除文件时备份文件)然后在模型文件夹中创建init.py文件并在init.py文件写入简单的文件之后行并在模型文件夹中创建模型文件后,模型文件名应与类名相同,如果类名是“Employee”,则模型文件名应类似于“employee.py”,然后在模型文件中定义您的数据库表与在 model.py 文件中的写入相同 保存
我的代码: from django_adminlte.models.employee import Employee 为您: from app_name.models.model_file_name_only import Class_Name_which_define_in_model_file
__init__.py
from django_adminlte.models.employee import Employee
model/employee.py (employee is separate model file)
from django.db import models
class Employee(models.Model):
eid = models.CharField(max_length=20)
ename = models.CharField(max_length=20)
eemail = models.EmailField()
econtact = models.CharField(max_length=15)
class Meta:
db_table = "employee"
# app_label = 'django_adminlte'
def __str__(self):
return self.ename
RuntimeError ModelX doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
。
我写了一个可能有用的脚本。
github.com/victorqribeiro/splitDjangoModels
它通过正确的命名和导入将模型拆分为单独的文件;它还创建一个初始化文件,以便您可以一次导入所有模型。
让我知道这是否有帮助
不定期副业成功案例分享
models.py
并希望稍后迁移时,这通常无法正常工作。在这种情况下,您必须删除迁移和数据库:/ 或者手动解决所有迁移文件中的所有错误