2011-06-13 14 views
49

मैं अपने ऐप के 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 

यह काम नहीं करता है, तो मैं 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; 

मैं बहुत इस बारे में निश्चित नहीं हूँ, लेकिन मैं एक चिंतित हूँ

from django.db import models 

class Store(models.Model): 
    class Meta: 
     app_label = "store" 

यह मेरा model3.py फ़ाइल है:: भाग The following references should be added but depend on non-existent tables:

boout यह मेरा model1.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" 

तो, चाहिए मैं मैन्युअल रूप से संदर्भों के लिए परिवर्तन चलाता हूं? इससे मुझे दक्षिण में समस्याएं आ सकती हैं?

+0

यदि आप app1.models.model1 आयात स्टोर 'से प्रयास करते हैं तो मॉडल 3 में क्या होता है? –

+0

आप यह भी देखना चाहेंगे कि http://stackoverflow.com/questions/5534206/how-do-i-separate-my-models-out-in-django/5534251#5534251 –

उत्तर

23

मैं कल्पना भी नहीं कर सकता कि आप ऐसा क्यों करना चाहते हैं। लेकिन मुझे लगता है कि आपके पास एक अच्छा कारण है। लेकिन अगर आप एक अच्छा कारण नहीं है MODEL1 रख दिया और सीधे में MODEL2

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/models.py और model3 और APP2/models.py

--- दूसरे भाग में model4 ---

यह वह जगह है APP1/submodels/model1.py फ़ाइल:

+०१२३५१६४१०६१ एक परियोजना है कि सिर्फ इस करता है का एक उदाहरण के लिए चेक आउट Django-अनुसूची:

from django.db import models 
from app1.models import Store 

class Product(models.Model): 
    store = models.ForeignKey(Store) 
    class Meta: 
     app_label = "product" 

संपादित, मामले में यह किसी के लिए फिर से आता है:

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

इस प्रकार अपने model3 फ़ाइल को ठीक करें। https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/

+1

इस उत्तर के संबंध में मुझे दूसरा मिला समस्या जब मॉडल 2.py में 'product.models आयात उत्पाद' से कुछ बनाते हैं: आयात त्रुटि: appx.models आयात से मॉडल – diegueus9

+0

नामित मॉड्यूल उत्पाद – Ted

+29

आप प्रति फ़ाइल एक वर्ग को बनाए रखने के लिए ऐसा करेंगे। – worc

11

मैं वास्तव में वास्तव में तुम क्या बारे में पूछ रहे के लिए एक ट्यूटोरियल का सामना करना पड़ा, तो आप इसे यहाँ देख सकते हैं:

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

एक प्रमुख मुद्दा शायद प्रासंगिक है कि - आप चाहते हो सकता है मेटा क्लास पर db_table फ़ील्ड का उपयोग करने के लिए स्थानांतरित कक्षाओं को अपनी तालिका में वापस इंगित करें।

मैं इस दृष्टिकोण की पुष्टि कर सकते Django 1.9 पर Django 1.3

+0

यह लिंक 404 –

+0

देता है ऐसा लगता है कि वह इसे http://paltman.com/breaking-apart-models-in-django/ पर ले जाया गया है –

63

में काम कर रहा है किसी को भी के लिए, यह अब वर्ग मेटाडेटा को परिभाषित बिना ढांचे द्वारा समर्थित है।

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

The manage.py startapp command creates an application structure that includes a models.py file. If you have many models, organizing them in separate files may be useful.

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.

तो, अपने मामले

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 

करने के लिए एक नोट की जरूरत है:

Explicitly importing each model rather than using from .models import * has the advantages of not cluttering the namespace, making code more readable, and keeping code analysis tools useful.

संबंधित मुद्दे