मॉडल उदाहरणों के माध्यम से प्रबंधक पहुंच योग्य नहीं है


87

मैं एक और एक में मॉडल ऑब्जेक्ट्स प्राप्त करने की कोशिश कर रहा हूं और मैं यह त्रुटि उठाता हूं:

 Manager isn't accessible via topic instance

यहाँ मेरा मॉडल है:

class forum(models.Model):
    # Some attributs

class topic(models.Model):
    # Some attributs

class post(models.Model):
    # Some attributs

    def delete(self):
        forum = self.topic.forum
        super(post, self).delete()
        forum.topic_count = topic.objects.filter(forum = forum).count()

यहाँ मेरा विचार है:

def test(request, post_id):
    post = topic.objects.get(id = int(topic_id))
    post.delete()

और मुझे मिलता है:

post.delete()
forum.topic_count = topic.objects.filter(forum = forum).count()
Manager isn't accessible via topic instances

जवाबों:


126

प्रश्न में त्रुटि तब होती है जब आप Managerमॉडल के उदाहरण के माध्यम से किसी मॉडल तक पहुंचने का प्रयास करते हैं । आपने निम्न श्रेणी के नामों का उपयोग किया है । इससे यह कहना मुश्किल हो जाता है कि त्रुटि एक पहुंच के कारण हुई है Managerया नहीं। चूंकि अन्य परिदृश्य जो इस त्रुटि का कारण बन सकते हैं वे अज्ञात हैं मैं इस धारणा पर आगे बढ़ रहा हूं कि आपने किसी तरह topicचर को मिलाया है ताकि आप topicवर्ग के बजाय मॉडल के एक उदाहरण को इंगित करें ।

यह पंक्ति अपराधी है:

forum.topic_count = topic.objects.filter(forum = forum).count()
#                   ^^^^^

आपको उपयोग करना होगा:

forum.topic_count = Topic.objects.filter(forum = forum).count()
#                   ^^^^^
#                   Model, not instance.

क्या गलत हो रहा है? objectsएक है Managerश्रेणी स्तर पर उपलब्ध है, उदाहरणों के लिए नहीं। देखें वस्तुओं पुन: प्राप्त करने के लिए दस्तावेज़ जानकारी के लिए। धन भाव:

Managers"तालिका-स्तरीय" संचालन और "रिकॉर्ड-स्तरीय" कार्यों के बीच एक अलगाव को लागू करने के लिए, मॉडल उदाहरणों के बजाय केवल मॉडल कक्षाओं के माध्यम से सुलभ हैं ।

(महत्व दिया)

अपडेट करें

नीचे @Daniel की टिप्पणियाँ देखें। यह एक अच्छा विचार है (nay, you MUST: P) वर्ग नामों के लिए शीर्षक मामले का उपयोग करने के लिए। के Topicबजाय उदाहरण के लिए topic। आपके वर्ग के नाम कुछ भ्रम पैदा करते हैं चाहे आप किसी उदाहरण या वर्ग का उल्लेख कर रहे हों। चूंकि Manager isn't accessible via <model> instancesमैं बहुत विशिष्ट हूं इसलिए मैं एक समाधान प्रस्तुत करने में सक्षम हूं। त्रुटि हमेशा इतनी स्पष्ट नहीं हो सकती है।


हालाँकि, topicवास्तविक मॉडल वर्ग प्रतीत होता है, और उसके द्वारा दिए गए कोड के अनुसार उदाहरण नहीं है।
डैनियल डायपोलो

@ डैनियल: सच। और फिर भी त्रुटि Manager isn't accessible via Foo instancesकेवल तभी संभव है जब आप Managerकिसी इंस्टेंस का उपयोग करने का प्रयास करते हैं। सोर्स कोड देखें: code.djangoproject.com/svn/django/trunk/django/db/models/…
मनोज गोविंदन

4
वास्तव में, शायद एक अन्य कारण ("यह सबसे अच्छा अभ्यास है") वर्ग के नाम के लिए लोअरकेस अक्षरों का उपयोग नहीं करना :) ऐसा प्रतीत होता है कि वह संभवतः topicएक स्थानीय उदाहरण चर के रूप में उपयोग कर रहा है और कक्षा के संदर्भ को दूर उड़ा रहा है।
डैनियल डायपोलो

2
आपको इस्तेमाल करना चाहिए थाtopic.model_class().objects
निमो

7
आप भी इस्तेमाल कर सकते हैं topic.__class__.objects। यह ऐसा प्रतीत होता model_class()@Nimo ने उल्लेख किया काम नहीं करता है ऊपर
sleepycal

54
topic.__class__.objects.get(id=topic_id)

Django v1.10 के रूप में काम करता है।
जेम्स

3
__class__अमूर्त मॉडल के भीतर तरीकों के लिए यह बेहतर काम करता है, क्योंकि हम वंशज वर्ग के वास्तविक नाम को नहीं जानते हैं। इस स्थिति में, मैंने इस्तेमाल कियाself.__class__.objects.get
कॉमसेटोंग

33

Django के लिए <1.10

topic._default_manager.get(id=topic_id)

हालांकि आपको इसका इस तरह उपयोग नहीं करना चाहिए। _Default_manager और _base_manager निजी हैं, इसलिए यह उनका उपयोग करने के लिए तभी पुन: उपयोग किया जाता है जब आप टॉपिक मॉडल के अंदर हों, जैसे जब आप एक मालिकाना फ़ंक्शन में प्रबंधक का उपयोग करना चाहते हैं, तो हम कहते हैं:

class Topic(Model):
.
.
.
    def related(self)
        "Returns the topics with similar starting names"
        return self._default_manager.filter(name__startswith=self.name)

topic.related() #topic 'Milan wins' is related to:
# ['Milan wins','Milan wins championship', 'Milan wins by one goal', ...]

5
धन्यवाद, यह उत्तर वही था जो मैं खोज रहा था। काश मैं एक से अधिक बार मतदान कर पाता। इसके लिए मेरा उपयोग-मामला तब है जब आप एक अमूर्त मॉडल में कार्यक्षमता जोड़ रहे हैं, जहां आपको पता नहीं चलेगा (इस स्तर पर) कि अंतिम मॉडल वर्ग को क्या कहा जाता है।
बजकर

2
या उपयोग करें topic.__class__.objects.get(id=topic_id)
बेंटले 4

1
यह एक पुराना उत्तर है, लेकिन Django v1.10 के रूप में मैं अब इन निजी तरीकों को नहीं देखता हूं। हालांकि, self.__class__.objectsआपके अन्य उत्तर के अनुसार चाल है।
जेम्स

5

बहुत अधिक परांठे की एक जोड़ी के कारण भी हो सकता है, जैसे

ModelClass().objects.filter(...)

सही के बजाय

ModelClass.objects.filter(...)

कभी-कभी मुझे लगता है जब bpython (या एक IDE) स्वचालित रूप से parantheses जोड़ता है।

परिणाम, निश्चित रूप से, एक ही है - आपके पास एक वर्ग के बजाय एक उदाहरण है।


0

यदि विषय ContentType उदाहरण था (जो यह नहीं है), तो यह काम करेगा:

topic.model_class().objects.filter(forum = forum)

model_class()ContentTypeमॉडल की एक विधि है । सहित अन्य मॉडल उदाहरण, topicएक model_classविधि नहीं है ।
अलास्दैर

क्षमा करें, मुझे यह प्रश्न गलत लगा होगा। मैं एक प्रतीत होता है कि इसी तरह के सवाल को हल करने की कोशिश कर रहा था ...
निमो

0

मेरे पास इस त्रुटि के समान एक मुद्दा था। और अपने कोड को देखकर यह लगता है कि यह आपका मुद्दा भी हो सकता है। मुझे लगता है कि आपका मुद्दा यह है कि आपकी "आईडी" की तुलना "इंट (टॉपिक_ड)" और टॉपिक_आईडी सेट नहीं है।

def test(request, post_id):
    post = topic.objects.get(id = int(topic_id))
    post.delete()

मुझे लगता है कि आपका कोड "post_id" का उपयोग नहीं करना चाहिए "topic_id"

def test(request, post_id):
    post = topic.objects.get(id = int(post_id))
    post.delete()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.