将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中工作