python - انقسام models.py إلى عدة ملفات




django django-models (2)

أحاول تقسيم 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"

هذا هو ملف .3.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"

لذا ، هل يجب علي تشغيل المراجع للمراجع يدويًا؟ هذا قد يجلب لي مشاكل مع الجنوب؟


لأي شخص في Django 1.9 ، يتم دعمه الآن من خلال الإطار بدون تعريف بيانات التعريف للفئة.

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

ملاحظة: بالنسبة لـ Django 2 ، لا يزال هو نفسه

يقوم الأمر manage.py startapp بإنشاء بنية تطبيق تتضمن ملف models.py. إذا كان لديك العديد من الطرز ، فقد يكون من المفيد تنظيمها في ملفات منفصلة.

للقيام بذلك ، قم بإنشاء حزمة نماذج. قم بإزالة models.py وقم بإنشاء myapp/models/ directory باستخدام ملف __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 * استيراد كل نموذج بشكل صريح بدلاً من استخدامه from .models import * مزايا عدم ازدحام مساحة الاسم ، مما يجعل التعليمة البرمجية أكثر قابلية للقراءة ، والحفاظ على أدوات تحليل التعليمات البرمجية مفيدة.


لا أستطيع حتى أن أتخيل لماذا تريد أن تفعل هذا. لكن سأفترض أنك حصلت على سبب وجيه إذا كنت بحاجة إلى القيام بذلك لسبب ما ، فسأفعل ما يلي:

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"

تم التعديل في حالة ظهور ذلك مرة أخرى لشخص ما: راجع جدول جانجان للحصول على مثال لمشروع يقوم بهذا فقط. https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/





import