我正在尝试将我的应用的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吗?这可能会给我带来南方问题吗?
答案 0 :(得分:102)
对于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并创建一个
myapp/models/
目录,其中包含__init__.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
你只需要做
#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 *
具有不会使命名空间混乱,使代码更具可读性以及保持代码分析工具有用的优点。
答案 1 :(得分:24)
我甚至无法想象你为什么要这样做。但我会假设你有充分的理由。如果我出于某种原因需要这样做,我会做以下事情:
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 *
但是,如果你没有充分的理由,请将app1 / model.x中的model1和model2直接放在app2 / models.py中的app3 / model3和model4中
---第二部分---
这是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/
答案 2 :(得分:11)
我实际上遇到了一个关于你所询问的教程,你可以在这里查看:
http://paltman.com/breaking-apart-models-in-django/
可能相关的一个关键点 - 您可能希望使用Meta类上的db_table字段将重定位的类指向它们自己的表。
我可以确认这种方法在Django 1.3中有效
答案 3 :(得分:1)
最简单的步骤:
我的代码:从django_adminlte.models.employee导入Employee
为您的:从 app_name .models。 model_file_name_only 导入 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
答案 4 :(得分:0)
我写了一个可能有用的脚本。
github.com/victorqribeiro/splitDjangoModels
通过适当的命名和导入将模型拆分为单个文件;它还会创建一个init文件,以便您可以一次导入所有模型。
让我知道这是否有帮助
答案 5 :(得分:0)
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 文件中导入模型。
<块引用>例如,如果您的模型目录中有有机.py 和合成.py:
{{1}}