将 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

这不工作,然后我找到了 这个,但在这个解决方案我仍然有一个问题,当我运行 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:这部分

This is my model1.py file:

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"

那么,我是否应该手动运行参考文献的备份? 这可能会给我带来与南方的问题?

71134 次浏览

我会这么做:

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 *

但是,如果您没有一个好的理由,那么直接将 model 1和 model 2放在 app1/model. py 中,将 model 3和 model 4放在 app2/model. py 中

- 第二部分

This is app1/submodels/model1.py file:

from django.db import models
class Store(models.Model):
class Meta:
app_label = "store"

因此,更正您的 model 3.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-plan,它是一个完成此任务的项目示例。 Https://github.com/thauber/django-schedule/tree/master/schedule/models Https://github.com/thauber/django-schedule/

我碰巧看到一个教程,你可以点击这里查看:

Http://paltman.com/breaking-apart-models-in-django/

一个可能相关的关键点是——您可能希望使用 Meta 类上的 db _ table 字段将重新定位的类指向它们自己的表。

我可以确定这种方法在 Django 1.3中是有效的

对于 Django 1.9上的任何人来说,这个框架现在都支持它,而不需要定义类元数据。

Https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package

注意: 对于 Django 2,它仍然是一样的

manage.py startapp命令创建一个应用程序结构,其中包含一个 model. py 文件。如果您有许多模型,将它们组织在单独的文件中可能是有用的。

为此,请创建一个 model 包。删除 models.py 并创建一个 myapp/models/目录,其中包含一个 __init__.py文件和用于存储模型的文件。您必须导入 __init__.py文件中的模型。

So, in your case, for a structure like

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

A note against importing all the classes:

显式地导入每个模型而不是使用 from .models import *,这样做的好处是不会使名称空间变得混乱,使代码更易读,并使代码分析工具保持有用。

最简单的步骤:

  1. 在应用程序中创建模型文件夹(文件夹名称应为 模特)
  2. 从应用程序目录 (在删除文件时备份该文件)中删除 model.py 文件
  3. 并在模型文件夹中创建 init.py 文件
  4. 并且在 Init.py 文件后面写简单的一行
  5. And after create model file in your model folder and model file name should be same like as class name,if class name is 'Employee' than model file name should be like 'employee.py'
  6. 然后在模型文件中定义数据库表,就像在 model.py文件中写一样
  7. 省省吧

我的代码: from django _ adminlte. models.Employee import Employee

For your: from App _ name.mods.Model _ file _ name _ only import Class _ Name _ which _ Definition _ 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

我写了一个可能有用的剧本。

Github.com/victorqribeiro/splitdjangomodels

它通过正确的命名和导入将模型分割到单独的文件中; 它还创建了一个 init 文件,这样您就可以一次导入所有的模型。

如果有帮助就告诉我

Django 3的相关链接是:

Https://docs.djangoproject.com/en/3.2/topics/db/models/#organizing-models-in-a-package

Links to previous versions of documentation are broken. The example there is very succinct:

To do so, create a models package. Remove models.py and create a myapp/models/ directory with an Init.py file and the files to store your models. You must import the models in the Init.py file.

例如,如果 model 目录中有 organic.py 和 synthetic.py:

from .organic import Person
from .synthetic import Robot