将models.py分割成几个文件
我试图将我的应用程序的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
这不工作,然后我发现这一点 ,但在这个解决scheme,我仍然有一个问题,当我运行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? 这可能会带给我南方的问题?
我什至不能想象为什么你想这样做。 但我会认为你有一个很好的理由。 如果我出于某种原因需要这样做,我会执行以下操作:
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文件:
from django.db import models from app1.models import Store class Product(models.Model): store = models.ForeignKey(Store) class Meta: app_label = "product"
编辑,以防万一有人再次出现:检查Django的日程安排一个项目,这样做的例子。 https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/
对于Django 1.9上的任何人,现在都可以在没有定义类元数据的情况下被框架支持。
https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package
manage.py startapp
命令创build一个包含models.py文件的应用程序结构。 如果你有很多模型,把它们组织成单独的文件可能是有用的。为此,请创build一个模型包。 删除models.py并使用
__init__.py
文件和存储模型的文件创build一个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 *
具有不混乱命名空间,使代码更具可读性,保持代码分析工具有用的优点。
我实际上遇到了一个关于你正在问什么的教程,你可以在这里查看:
http://paltman.com/breaking-apart-models-in-django/
一个关键点可能是相关的 – 你可能想要使用Meta类中的db_table字段将重定位的类指向自己的表。
我可以证实这个方法在Django 1.3中工作