将models.py拆分为多个文件

时间:2011-06-13 21:34:47

标签: python django django-models import

我正在尝试将我的应用的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吗?这可能会给我带来南方问题吗?

6 个答案:

答案 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)

最简单的步骤:

  1. 在您的应用中创建模型文件夹(文件夹名称应为模型
  2. 从应用目录中删除model.py文件(在删除文件时备份文件)
  3. 然后在模型文件夹中创建 init .py文件
  4. 然后在 init .py文件中写入简单的一行
  5. 在模型文件夹中创建模型文件后,模型文件名称应与类名称相同,如果类名称为“ Employee”,则模型文件名称应类似于“ employee.py”
  6. 然后在模型文件中定义您的数据库表,就像在 model.py 文件
  7. 中那样写
  8. 保存
  

我的代码:从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}}