Django - परिपत्र मॉडल आयात मुद्दा


116

मुझे वास्तव में यह नहीं मिल रहा है, इसलिए यदि कोई यह समझा सकता है कि यह कैसे काम करता है तो मैं इसकी बहुत सराहना करूंगा। मेरे पास दो एप्लिकेशन, खाते और थीम हैं ... यहां मेरी सेटिंग सूची है:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'accounts',
    'themes',
)

खातों में, मैं यह करने की कोशिश कर रहा हूं:

from themes.models import Theme

class Account(models.Model):
    ACTIVE_STATUS = 1
    DEACTIVE_STATUS = 2
    ARCHIVE_STATUS = 3
    STATUS_CHOICES = (
        (ACTIVE_STATUS, ('Active')),
        (DEACTIVE_STATUS, ('Deactive')),
        (ARCHIVE_STATUS, ('Archived')),
    )

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=250)
    slug = models.SlugField(unique=True, verbose_name='URL Slug')
    status = models.IntegerField(choices=STATUS_CHOICES, default=ACTIVE_STATUS, max_length=1)
    owner = models.ForeignKey(User)
    enable_comments = models.BooleanField(default=True)
    theme = models.ForeignKey(Theme)
    date_created = models.DateTimeField(default=datetime.now)

और मेरे थीम मॉडल में:

class Theme(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=250)
    slug = models.SlugField(unique=True, verbose_name='URL Slug')
    date_created = models.DateTimeField(default=datetime.now)

class Stylesheet(models.Model):
    id = models.AutoField(primary_key=True)
    account = models.ForeignKey(Account)
    date_created = models.DateTimeField(default=datetime.now)
    content = models.TextField()

Django निम्नलिखित त्रुटि को मार रहा है:

from themes.models import Theme
ImportError: cannot import name Theme

क्या यह किसी प्रकार का परिपत्र आयात मुद्दा है? मैंने एक आलसी संदर्भ का उपयोग करने की कोशिश की है, लेकिन यह भी काम नहीं करता है!


1
यह परिपत्र आयात के साथ एक मुद्दे की तरह दिखता है। आपको परिभाषित Accountमॉड्यूल से आयात करने की आवश्यकता क्यों है Theme?
डोमिनिक रॉगर

क्षमा करें, मैंने अपने थीम्स मॉडल को सही ढंग से पेस्ट नहीं किया है, मैंने अपनी पोस्ट अपडेट कर दी है। मैं इसे स्टाइल्सशीट क्लास में उपयोग कर रहा हूं।
हनपन

जवाबों:


213

के आयात को निकालें Themeऔर इसके बजाय एक स्ट्रिंग के रूप में मॉडल नाम का उपयोग करें।

theme = models.ForeignKey('themes.Theme')

5
वास्तव 'themes.Theme'में यह होना चाहिए , क्योंकि यह एक अलग ऐप में है।
डैनियल रोसमैन

आह, यह काम किया, मैं पहले सिर्फ 'थीम' की कोशिश कर रहा था और यह काम नहीं किया। धन्यवाद। क्या इस तरह से करने के लिए किसी तरह का प्रदर्शन हिट है? अगर संभव हो तो मैं अपने लुक को नॉन लेज रखना चाहूंगा :)
हनपन

@ डैनियल: अपडेट किया गया। @ हंस: एक छोटा सा, हाँ। लेकिन केवल एक बार।
इग्नासियो वाज़क्वेज़-अब्राम्स

56

ऊपर Django 1.7:

उपयोग get_modelसमारोह django.db.modelsजिसमें से आलसी मॉडल आयात के लिए डिज़ाइन किया गया है:

from django.db.models import get_model
MyModel = get_model('app_name', 'ModelName')

आपके मामले में:

from django.db.models import get_model
Theme = get_model('themes', 'Theme')

अब आप उपयोग कर सकते हैं Theme

Django के लिए 1.7+:

from django.apps import apps
apps.get_model('app_label.model_name')

10
Django में उपयोग करें apps.get_model(app_label, model_name)या apps.get_model('app_label.model_name')
1.7+

51

किसी चीज का मैंने कहीं भी पर्याप्त विस्तार से उल्लेख नहीं किया है कि एक अलग ऐप में मॉडल को संदर्भित करते समय फॉरेनके के अंदर स्ट्रिंग को ठीक से कैसे तैयार किया जाए। इस तार को होना जरूरी है app_label.model_name। और, बहुत महत्वपूर्ण बात, app_labelINSTALLED_APPS में पूरी लाइन नहीं है, लेकिन केवल इसका अंतिम घटक है। तो अगर आपका INSTALLED_APPS ऐसा दिखता है:

INSTALLED_APPS = (
...
    'path.to.app1',
    'another.path.to.app2'
)

फिर एक विदेशियों को App2 मॉडल में app2 में एक मॉडल में शामिल करने के लिए, आपको करना चाहिए:

app2_themodel = ForeignKey('app2.TheModel')

मैंने एक लंबा समय बिताया जब from another.path.to.app2.models import TheModelमैं इस पर ठोकर खाने से पहले एक परिपत्र आयात मुद्दे को हल करने की कोशिश कर रहा था (इसलिए मैं बस नहीं कर सका ), google / SO कोई मदद नहीं था (सभी उदाहरणों में एकल घटक ऐप पथ थे), इसलिए उम्मीद है कि यह अन्य मदद करेगा django newbies।


40

Django 1.7 सही तरीका इस तरह से जाने के लिए है:

from django.apps import apps

YourModel = apps.get_model('your_app_name', 'YourModel')

देखें: https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.apps.get_model


5
एक एकल-आर्ग शॉर्टकट सिंटैक्स भी है: आदि apps.get_model('your_app_name.YourModel')में उपयोग के लिए सुविधाजनक हैmap
टेलर एड्मिस्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.