Django

2017-05-08 6 views
6

में किसी अन्य ऐप से मॉडल आयात नहीं कर सकता है, इसलिए मेरे पास एक ही प्रोजेक्ट में 2 ऐप्स चल रहे हैं।Django

मेरे फ़ाइलें इस प्रकार संरचित कर रहे:

/project_codebase 
    /project 
     __init.py 
     settings.py 
     urls.py 
     wsgi.py 
     ...  
    /app1 
     ... 
    /app2 
     ... 
    manage.py 

तो, मैं कुछ अजीब कारण के लिए मेरी आधार निर्देशिका के लिए एक अलग नाम है (जो है, यह codebase के साथ समाप्त होता है)। उम्मीद है कि यह कोई मुद्दा नहीं है।

मेरी settings.py में, मैं यह है:

INSTALLED_APPS = [ 
    ... 

    'app1', 
    'app2', 
] 

ठीक है, तो (APP2 से) मेरी models.py में, मैं आसानी से मॉडल APP1 से from app1.models import * साथ आयात कर सकते हैं, हालांकि, जब मैं अपने models.py (app1 से) में from app2.models import * का उपयोग करता हूं, तो मुझे एक आयात त्रुटि मिलती है।

इस के लिए कोई समाधान?

+0

हो सकता है यह सर्कुलर निर्भरता के कारण है। http://stackoverflow.com/questions/744373/circular-or-cyclic-imports-in-python – badiya

+3

ठीक है, आपने एक परिपत्र आयात निर्भरता बनाई है। आपको प्रत्येक ऐप के मॉडल को दूसरे में आयात करने की आवश्यकता क्यों है? –

+0

आपको एक उत्तर स्वीकार करना चाहिए। – dendragon

उत्तर

11

यह परिपत्र आयात समस्याओं के कारण हो सकता है। इससे बचने के लिए आप मॉडल गतिशील लोड होनी चाहिए: Django के

के लिए हाल के संस्करण (1.7+) का उपयोग application registry:

from django.apps import apps 
MyModel1 = apps.get_model('app1', 'MyModel1') 

के लिए पहले django संस्करणों (< 1.7):

from django.db.models.loading import get_model 
MyModel1 = get_model('app1', 'MyModel1') 

नोट 1: यदि आप टी चाहते हैं o विदेशीकी संबंध परिभाषित करें, एक अलग आयात विवरण की आवश्यकता नहीं है। इस पर Django has you covered:

हैं app1 एक इंस्टॉल किया गया ऐप्स है, तो आप इस प्रकार ForeignKey संबंधों को परिभाषित करना चाहिए:

# in app2.py 
class MyModel2(models.Model): 
    mymodel1 = models.ForeignKey('app1.MyModel1') 

नोट 2: get_model तभी काम करता है app1 एक इंस्टॉल किया गया ऐप्स और MyModel1 है वह मॉडल जिसे आप app1 से आयात करना चाहते हैं।

नोट 3:, वाइल्डकार्ड आयात (from ... import *) से बचने के लिए this is bad practice के रूप में की कोशिश करो।

1

आपको from app1.models import ModelName1, ModelName2 के लिए, उन मॉडल नामों को निर्दिष्ट करने की आवश्यकता है जिन्हें आप आयात करना चाहते हैं।

5

यह निश्चित रूप से एक परिपत्र आयात है।

लेकिन मुझे लगता है कि आपको कुछ प्रकार की रेटेशनफिल्ड्स (ForeignKey, ManyToManyField या OneToOneField) के रूप में मॉडल का उपयोग करना है।

# app1/models.py 
class Model1(models.Model): 
    relation_field = models.ForeignKey('app2.Model2') 

से docs:: तो आप आयात छोड़ सकते हैं और के रूप में तो उपयोग करने की आवश्यकता आप एक मॉडल है जो अभी तक परिभाषित नहीं किया गया पर एक रिश्ता बनाने की आवश्यकता है

, आप के नाम का उपयोग कर सकते हैं मॉडल के बजाय मॉडल वस्तु ही

किसी अन्य अनुप्रयोग में परिभाषित मॉडल का उल्लेख करने के लिए, आप स्पष्ट रूप से एक मॉडल पूर्ण आवेदन लेबल

साथ निर्दिष्ट कर सकते हैं

बस str ऑब्जेक्ट को <app_name>.<Model_name> पर ली गई संबंध फ़ील्ड के लिए पहली तर्क के रूप में रखें।

नोट: यह आप केवल कुछ विशिष्ट मॉड्यूल आयात करने के लिए तो import * का उपयोग नहीं करना चाहते हैं मॉड्यूल (from <module_name> import *) से सब कुछ आयात करने

3

से बचने के लिए बेहतर है।

इसमें आपकी सभी लाइब्रेरी लोड करने में अधिक समय लगेगा और इसलिए आपके ऐप की गति को भी प्रभावित कर सकते हैं।

आप तो अपने दूसरे app से कुछ मॉड्यूल का उपयोग करने के सिर्फ इस तरह मॉड्यूल का नाम के बजाय पूरे पुस्तकालयों कुछ जोड़ना चाहते हैं:

from app2.models import Module1, Module2 

या यह रूप में अन्य स्पष्ट परिपत्र आयात मुद्दा हो सकता है।

धन्यवाद।

0

मैं हमेशा इस कोड का उपयोग और यह काम :) है

from position_app.models import Member