2011-06-01 18 views
7

का उपयोग करते समय ManyToMany फ़ील्ड सहेजा नहीं गया है, मुझे एक अजीब समस्या का सामना करना पड़ रहा है, जिसमें मुझे उम्मीद है कि यहां कोई व्यक्ति कुछ प्रकाश डालने में सक्षम हो सकता है।Django व्यवस्थापक

मैं सुपर() चलाने के बाद कईToMany-field में कुछ मान जोड़ने के लिए मॉडल के सेव() विधि को ओवरराइड कर रहा हूं। मेरी समस्या यह है कि जब मैं Django व्यवस्थापक में बचत कर रहा हूं तो मान संबंधों में जोड़े जाते हैं लेकिन फिर खाली हो जाते हैं।

यदि मैं इसे manage.py shell से करता हूं तो यह बिना किसी समस्या के काम करता है।

मैंने वहां दो प्रिंट स्टेटमेंट लगाए हैं और अगर मैं Django व्यवस्थापक या खोल के माध्यम से इसे चला रहा हूं, तो वे सटीक उसी आउटपुट का उत्पादन करते हैं।

class Store(models.Model): 
    holidays = models.ManyToManyField(StoreHoliday, blank=True) 
    copy_holidays_from = models.ForeignKey('Store', blank=True, null=True) 

    def save(self): 
     print '==== BEFORE SAVE:', self.holidays.all() 
     super(Store, self).save() 
     self.copy_holidays() 
     print '==== AFTER SAVE:', self.holidays.all() 

    def copy_holidays(self): 
     if self.pk and self.copy_holidays_from: 
      self.holidays.clear() 
      for h in self.copy_holidays_from.holidays.all(): 
       self.holidays.add(h) 

यह print बयान के उत्पादन में है:

==== BEFORE SAVE: [] 
==== AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>] 

किसी को भी यह क्या कारण हो सकता है पर किसी भी सुझाव हैं?

संपादित करें: बचत इंटरफ़ेस के माध्यम से सहेजते समय डीजेगो द्वारा सहेजे गए एम 2 एम रिलेशनशिप में सभी मैन्युअल परिवर्तनों को छोड़ दिया जाता है। क्या यह इस फ़ॉर्म को संसाधित करता है?

+0

मुझे नहीं पता कि आपकी समस्या कहां है, लेकिन 'self.holidays = self.copy_holidays_from.holidays.all()' बहुत अच्छा दिखता है और फिर समाशोधन करता है। – DrTyrsa

+0

टिप के लिए धन्यवाद, मुझे नहीं पता था कि यह संभव था। आप नीचे क्या देख सकते हैं मैंने क्या गलत किया। –

उत्तर

10

तो यह पता चला है कि उपर्युक्त इसे लागू करने का सही तरीका नहीं था। Code_dave() को ओवरराइड करके, कोडएडमिन में कोड था।

यह मैं कैसे इसे हल है:

class StoreAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     if obj.copy_holidays_from: 
      form.cleaned_data['holidays'] = obj.copy_holidays_from.holidays.all() 

     super(StoreAdmin, self).save_model(request, obj, form, change) 
2

मैं शायद आज ही यह एक ही व्यवहार में पड़ गए और हाँ, आप यह सोचते हैं कि यह कैसे Django डेटा का प्रबंधन कैसे संबंधित है में सही हैं।

django व्यवस्थापक वास्तविक वस्तु को बदलने से अलग-अलग कई क्षेत्रों में परिवर्तन करता है। (याद रखें कि m2m एक अलग डेटाबेस तालिका में सहेजा गया है)।

मेरे मामले में यदि मैंने व्यवस्थापक साइट में ManyToMany फ़ील्ड में कुछ भी नहीं चुना है, तो यह ManyToMany संबंधों पर एक स्पष्ट() - ऑपरेशन में अनुवाद करेगा। सहेजने वाली सभी चीजें() - विधि को तुरंत इस स्पष्ट द्वारा हटा दिया जाता है। पोस्ट_सेव सिग्नल हैंडलर में मैंने जो सामान किया था, वही चीज़।

समाधान (मेरे लिए) कईToMany-field को इनलाइन में अलग करना था, इसलिए ऑब्जेक्ट को संशोधित करते समय यह स्वचालित रूप से खाली नहीं होता है।

+0

हाय वहाँ ज्यर्स, मुझे Django व्यवस्थापक के साथ एक ही समस्या है। हमारे पास एक एम 2 एम फ़ील्ड है जिसे कभी-कभी साफ़ किया जाता है जब शेष पृष्ठ सहेजा जाता है। मुझे नहीं पता था कि Django इसे अलग से बचाता है। क्या आप शायद मुझे एम 2 एम को संभालने के तरीके के बारे में कुछ और जानकारी के साथ जोड़ सकते हैं? क्या आप अधिक विशिष्ट हो सकते हैं कि किस तरह की परिस्थितियों में सेव विधि की कार्रवाइयां साफ़ की जाती हैं? धन्यवाद! – iank

+0

iank: यह बग रिपोर्ट मदद कर सकती है: https://code.djangoproject.com/ticket/6707 –

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