2011-05-23 7 views
15

मैं एक संबंधित मॉडल को सहेजते समय अपडेट करने के लिए कई मॉडल प्राप्त करने की कोशिश कर रहा हूं। यह m2m_changed signal का उपयोग करना संभव होना चाहिए (और यह काम करता है! लेकिन व्यवस्थापक में नहीं?) उदा।Django व्यवस्थापक m2m_changed सिग्नल के साथ post_remove कार्रवाई नहीं भेज रहा है

# i want the references field to update when related model is saved. 
# so just call count_references 

class Tag(models.Model): 
    """Group everything into categories""" 
    # stuff stuff stuff 
    references = models.IntegerField(default=0, editable=False) 

    def count_references(self): 
     # just add up references each time to save headaches 
     self.references = 0 
     # search for reverse managers 
     sets = re.compile('^\w+_set$') 
     for rel_set in [method for method in dir(self) if sets.match(method)]: 
      self.references += getattr(self, rel_set).count() 
     self.save() 

class Entry(models.Model): 
    """Blog entry""" 
    # stuff stuff stuff 
    tags = models.ManyToManyField('Tag', blank=True) 

# this will call count_references when entry adds or removes tags 

@receiver(m2m_changed, sender=Entry.tags.through) 
def update_tag_ref_count(sender, instance, action, reverse, model, pk_set, **kwargs): 
    print action 
    if not reverse and action == 'post_add' or action == 'post_remove': 
     for tag_pk in pk_set: 
      print tag_pk 
      Tag.objects.get(pk=tag_pk).count_references() 
      print Tag.objects.get(pk=tag_pk).references 

सब कुछ खोलने पर पूरी तरह से काम करता है। जैसे इसलिए तरह एक tests.py साथ:

t = Tag.objects.all()[0] 
s = Snippet.objects.all()[0] 

s.tags.remove(t) 
s.save() 

s.tags.add(t) 
s.save() 

मैं निम्नलिखित (जहां 'परीक्षण' टैग नाम मुद्रित किया जा रहा है):

pre_remove 
post_remove 
test 
0 
pre_add 
post_add 
test 
1 

सही! और जब मैं व्यवस्थापक में किसी प्रविष्टि में एक टैग जोड़ता हूं तो मुझे निम्न (HTTP सामग्री के बीच) मिलता है:

pre_clear 
post_clear 
pre_add 
post_add 
test 
1 

अभी भी अच्छा है! सुनिश्चित नहीं है कि पूर्व/post_clear के लिए क्या कहा गया था ... और जब मैं हटाता हूं:

pre_clear 
post_clear 

argh! pre/post_remove नहीं कहा जाता है! pre/post_clear बेकार है साथ ही यह कोई प्राथमिक कुंजी प्रदान नहीं करता है। यह व्यवस्थापक कार्यान्वयन में एक बग की तरह लगता है। कोई सुझाव?

अद्यतन: Bug #16073 दायर और स्वीकार किया गया।

+1

कृपया अपने प्रश्न का उत्तर दें। – jpic

+0

बग को [# 6707] (https://code.djangoproject.com/ticket/6707) के डुप्लिकेट के रूप में चिह्नित किया गया था क्योंकि यह मूल समस्या का एक लक्षण है। – rbanffy

उत्तर

2

(एक समुदाय विकी एक "अनुत्तरित" सवाल के रूप में इस बंद करने के लिए के रूप में इस बना रहा है।)

यह Django में एक बग है। ओपी ने https://code.djangoproject.com/ticket/16073 पर टिकट दायर किया।

+0

क्षमा करें, थोड़ी देर में यह जांच नहीं की है। जवाब के लिए धन्यवाद। –

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