django 将www.example.com拆分models.py为多个文件

a11xaf1n  于 2023-02-06  发布在  Go
关注(0)|答案(6)|浏览(159)

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

agyaoht7

agyaoht71#

Django 3的相关链接是:
https://docs.djangoproject.com/en/3.2/topics/db/models/#organizing-models-in-a-package
到以前版本文档的链接已断开。下面的示例非常简洁:
为此,请创建一个models包。删除models.py并创建一个myapp/models/目录,其中包含一个init.py文件和用于存储模型的文件。您必须导入init.py文件中的模型。
例如,如果模型目录中有organic.py和synthetic.py:

from .organic import Person
from .synthetic import Robot
m3eecexj

m3eecexj2#

最简单的步骤:
1.在应用中创建模型文件夹(文件夹名称应为model
1.从应用程序目录中删除www.example.com文件**(删除文件时备份文件)model.py file from app directory(Backup the file while you delete it)**
1.在模型文件夹中创建init. py文件后
1.并在init. py文件之后写入简单的一行
1.在模型文件夹中创建模型文件后,模型文件名应与类名相同,如果类名为"Employee",则模型文件名应与"employee.py"相同
1.之后在模型文件中定义您的数据库表,就像在model. py文件中一样
1.省省吧
我的代码:从django_adminlte. models. employee导入员工
对于您的:来自应用程序名称.模型。仅模型文件名称导入在模型文件中定义的类名称

__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
jljoyd4f

jljoyd4f3#

我写了一个剧本可能会有用。
github.com/victorqribeiro/splitDjangoModels
将模型拆分为单独的文件,并进行适当的命名和导入;它还创建了一个init文件,这样您就可以一次导入所有模型。
如果有帮助就告诉我

ocebsuys

ocebsuys4#

对于Django1.9上的任何人来说,现在框架都支持它,而不需要定义类元数据。
https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package

    • 注意:**对于Django 2,它仍然是相同的

manage.py startapp命令可创建包含www.example.com文件的应用程序结构。如果您有许多模型,将它们组织在单独的文件中可能会很有用。models.py file. If you have many models, organizing them in separate files may be useful.
为此,请创建一个models包。删除www.example.com并创建一个myapp/models/目录,其中包含__init__.py文件和用于存储模型的文件。您必须导入__init__.py文件中的模型。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.
所以,在你的例子中,对于这样的结构

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 *的好处是不会使名称空间混乱,使代码更可读,并保持代码分析工具的有用性。

waxmsbnn

waxmsbnn5#

我会这样做:

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放在app 1/ www.example.com中models.py,将model3和model 4放在app 2/models.py中
--第二部分--
这是app 1/子模型/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/modelshttps://github.com/thauber/django-schedule/

ggazkfy8

ggazkfy86#

我实际上遇到了一个教程,正是你所问的,你可以在这里查看它:
https://web.archive.org/web/20190331105757/http://paltman.com/breaking-apart-models-in-django/
有一个关键点可能是相关的-您可能希望使用 meta类上的db_table字段将重新定位的类指向它们自己的表。
我可以确认这种方法在Django1.3中是有效的

相关问题