2010-10-06 12 views
50

मैं मॉडल ऑब्जेक्ट्स उदाहरण को किसी अन्य में प्राप्त करने का प्रयास कर रहा हूं। और मैं इस त्रुटि बढ़ा:प्रबंधक उदाहरण उदाहरणों के माध्यम से सुलभ नहीं है

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 

उत्तर

77

प्रश्न में त्रुटि जब आपतक पहुंचने का प्रयास करते हैं तो इसका कारण बनता है मॉडल के उदाहरण के माध्यम से मॉडल के। आपने कम केस क्लास नामों का उपयोग किया है। इससे यह कहना मुश्किल हो जाता है कि त्रुटि 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 उपलब्ध है, उदाहरणों के लिए नहीं। विवरण के लिए documentation for retrieving objects देखें। मनी बोली:

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

(जोर जोड़ा)

अद्यतन

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

+0

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

+0

@ डैनियल: सच। और फिर भी त्रुटि 'प्रबंधक फू इंस्टेंस के माध्यम से सुलभ नहीं है' केवल तभी संभव है जब आप किसी इंस्टेंस का उपयोग करके 'प्रबंधक' तक पहुंचने का प्रयास करें। स्रोत कोड देखें: http://code.djangoproject.com/svn/django/trunk/django/db/models/manager.py –

+4

असल में, शायद एक और कारण ("यह सर्वोत्तम अभ्यास" के अलावा) लोअरकेस अक्षरों का उपयोग न करें कक्षा के नामों के लिए :) ऐसा लगता है कि वह संभावित रूप से 'विषय' का उपयोग स्थानीय आवृत्ति चर के रूप में कर रहा है और कक्षा के संदर्भ को दूर कर रहा है। –

31
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', ...] 
+4

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

+2

या 'विषय .__ वर्ग __। Object.get (id = topic_id)' का उपयोग करें। – Bentley4

+0

यह एक पुराना उत्तर है, लेकिन Django v1.10 के रूप में मुझे अब इन निजी तरीकों को नहीं दिख रहा है। हालांकि, 'स्वयं .__ वर्ग __। ऑब्जेक्ट्स' आपके अन्य उत्तर के प्रति चाल है। – James

28
topic.__class__.objects.get(id=topic_id) 
+0

Django v1.10 के रूप में काम करता है। – James

0

यदि विषय एक ContentType उदाहरण (जो यह नहीं है), इस काम किया है | गया:

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

['model_class()'] (https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.models.ContentType.model_class) 'ContentType' की एक विधि है आदर्श। 'विषय' सहित अन्य मॉडल उदाहरणों में 'model_class' विधि नहीं है। – Alasdair

+0

क्षमा करें, मुझे प्रश्न गलत तरीके से पढ़ना होगा। मैं एक समान प्रश्न के हल करने की कोशिश कर रहा था ... – Nimo

3

भी बहुत ज्यादा parantheses की एक जोड़ी की वजह से हो सकता है, जैसे

ModelClass().objects.filter(...) 
सही

ModelClass.objects.filter(...) 

के बजाय

कभी कभी मेरे लिए होता है जब bpython (या एक आईडीई) स्वचालित रूप से parantheses कहते हैं।

परिणाम, ज़ाहिर है, वही है - आपके पास कक्षा के बजाय एक उदाहरण है।

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