2010-01-13 38 views
6

मैं दो अन्य क्षेत्रों के तत्वों को संयोजित करके एक उत्पाद कोड (व्यवस्थापक में) बनाने की कोशिश कर रहा हूं - जिनमें से एक कईToManyField है। मैं बहुत की तरह जानने के लिए कि विशेष उत्पाद विकल्प चुना गया है कि क्षेत्र के माध्यम से पुनरावृति, और कहा कि गैर-संपादन योग्य उत्पाद कोड को उसकी किसी विविधता संलग्न करने के लिए, चाहते हैं:Django Newbie ManyRelated Manager Iterable प्रश्न नहीं

class ShirtColorClass(models.Model): 
    shirtcolor = models.CharField(_('Shirt Color'), unique=True, max_length=40) 
    def __unicode__(self): 
     return self.shirtcolor 

class ShirtClass(models.Model): 
    shirtmodel = models.CharField(_('Model of Shirt'), max_length=40) 
    shirtclr = models.ManyToManyField(_(ShirtColorClass, verbose_name='Shirt Color')) 
    shirtcode = models.CharField(_('Code for the shirt'), max_length=80, editable=False) 
    #...10 more fields... 
    def __unicode__(self): 
     return self.shirtmodel 
    def save(self): 
     for item in self.shirtclr: #these are the lines I'm not sure how to do 
      if 'Blue' in self.shirtclr: 
       self.shirtcode = u'%s%s' % ('B', self.shirtmodel) 
      else: 
       self.shirtcode = self.shirtmodel 
      super(ShirtClass,self).save() 

पल मैं पर मुझे कई रिलेटेड मैनेजर नहीं मिल रहा है, इसलिए मुझे पता है कि मैं कुछ गलत कर रहा हूं, लेकिन मुझे नहीं पता कि ... मैं एक बेवकूफ नौसिखिया सवाल होने के लिए पहले से माफ़ी मांगता हूं। धन्यवाद।

उत्तर

0

में default='' जोड़कर self.shirtcode = '' से बच सकते हैं दोनों अपने जवाब के लिए धन्यवाद। मैं बहुत की तरह एक फिल्टर के साथ एक में अपने जवाब के दोनों विलय कर दिया ... एक संपत्ति:

def _get_blue_shirts(self): 
    if self.shirtclr.filter(shirtcolor='Blue'): 
    return '%s%s' % ('B', self.shirtmodel) 
    else: 
    return self.shirtmodel 
blue_shirts=property(_get_blue_shirts) 

हालांकि यह दृष्टिकोण निश्चित रूप से काम करता है, मैं इसके साथ मुद्दों को देख सकते हैं के रूप में मैं इसे लिखा है। सबसे पहले, मैं व्यवस्थापक में खोजना चाहता हूं, उदाहरण के लिए, "बी 13 ए" शर्ट मॉडल के रूप में और यह समझ गया है कि मेरा मतलब है कि ब्लू के साथ "13 ए" शर्ट उपलब्ध है जो इसके रंगों में से एक है। चूंकि ModelAdmin.search_fields को वास्तविक फ़ील्ड को हल करने की आवश्यकता होती है, इसलिए यह दृष्टिकोण इस संबंध में काम नहीं करता है (अगर मैं वहां गलत हूं तो मुझे सही करें)। मेरी दूसरी चिंता यह है कि संपत्ति बहुत एसक्यूएल-भारी लगता है ... प्रत्येक पंक्ति के लिए एक अलग चयन निष्पादित करता है (जबकि एक समर्पित कॉलम को केवल एक समग्र चयन की आवश्यकता होगी ... फिर, अगर मैं गलत हूं तो मुझे सही करें)। कोई विचार है कि मैं इन चिंताओं को दूर करने के बारे में कैसे जा सकता हूं? शायद एक और तरीका मैं इसके बारे में जा सकता है?

पीएस। एंटनी ... मैंने संशोधित ओवरराइड सेव() को आजमाया और अभी भी "शर्ट क्लास" उदाहरण को कई महत्वपूर्ण रिश्तों का उपयोग करने से पहले प्राथमिक कुंजी मान प्राप्त करने की आवश्यकता है "त्रुटि। क्या मुझसे यहां कुछ गलत हो रहा है?

कई, कई, कई सब करने के लिए धन्यवाद, -bkev

12

.all() पर कॉल करने का प्रयास करें।

+0

... इस तरह तो कुछ: डीईएफ़ बचाने के (स्वयं): self.shirtclr.all() में आइटम के लिए : यदि आइटम = = 'ब्लू': self.shirtcode = यू '% s% s'% ('बी', self.shirtmodel) और : self.shirtcode = self.shirtmodel सुपर (ShirtClass, आत्म) .save() मैं काम करने के लिए काफी कुछ नहीं प्राप्त कर सकता ... शर्ट क्लास इष्टतम नहीं है त्रुटि है। मैं क्या गलत कर रहा हूं? एक बार फिर आपका धन्यवाद। – bkev

+0

मुझे लगता है कि हमें वापस कदम उठाने और यह पता लगाने की आवश्यकता है कि आप वास्तव में यहां क्या करने की कोशिश कर रहे हैं। –

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद। मैं पहले दो के घटकों को जोड़कर तीसरे क्षेत्र को बचाने की कोशिश कर रहा हूं ... केवल एक ही जटिलता यह है कि पहले दो में से एक मल्टी टॉनीफिल्ड है और मुझे इस उदाहरण में इसकी सामग्री तक पहुंचने का उचित तरीका नहीं पता है। मैंने जो शीर्ष पर लिखा है उसे देखते हुए, मुझे नहीं लगता कि मुझे वहां लूप की आवश्यकता है ... जब मैंने पहले पाइथन का उपयोग किया है, तो "इन" ने सूची के दौरान मेरे लिए काम किया है। हालांकि, "अगर 'ब्लू' self.shirtcode.all() में" मेरे लिए काम नहीं लग रहा है। मैं सोचता रहता हूं कि इसे पूरा करना मुश्किल नहीं होना चाहिए ... लेकिन मुझे कुछ याद आ रहा है ... – bkev

2

कॉल filter():

def save(self): 
    if self.pk!=None: 
     if self.shirtclr.filter(shirtcolor='Blue'): 
      self.shirtcode = u'%s%s' % ('B', self.shirtmodel) 
     else: 
      self.shirtcode = self.shirtmodel 
    else: 
     self.shirtcode = '' 

आप

shirtcode = models.CharField(_('Code for the shirt'), max_length=80, editable=False, default='') 
+0

क्या आपने इसे आजमाया? –

+0

हां (और आपके उत्तर के लिए धन्यवाद ... क्षमा करें मैं तुरंत आपको वापस नहीं मिल सका)। यदि कोई मौजूदा उदाहरण नहीं था, तो मुझे "शर्ट क्लास" उदाहरण के लिए प्राथमिक कुंजी मान प्राप्त करने की आवश्यकता होती है, इससे पहले कि कई से अधिक रिश्तों का उपयोग किया जा सके "त्रुटि। यदि कोई था, तो पोस्ट पूरा हो जाएगा, लेकिन शर्टकोड शर्टमोडेल के बराबर होगा चाहे कोई भी रंग मैंने चुना हो। कोई विचार? – bkev

+0

अपवाद के लिए - उत्तर को सही किया गया, अब काम करना चाहिए। शर्टकोड हमेशा शर्टमोडेल के बराबर होने के नाते, क्या आप सुनिश्चित हैं कि यह बिल्कुल 'ब्लू' है, उदाहरण के लिए नहीं 'ब्लू' या 'ब्लू' ' –

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