2011-05-23 20 views
15

Tôi đang cố gắng tải nhiều mô hình để cập nhật khi tôi lưu mô hình liên quan. Điều này có thể được thực hiện bằng cách sử dụng m2m_changed signal (và nó hoạt động! Nhưng không phải trong quản trị viên?) Ví dụ:Quản trị Django lưu không gửi hành động post_remove với tín hiệu m2m_changed

# 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 

Mọi thứ hoạt động hoàn hảo khi chạy trong trình bao. ví dụ. với một tests.py như vậy:

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

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

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

tôi nhận được như sau (nơi 'test' là tên thẻ được in):

pre_remove 
post_remove 
test 
0 
pre_add 
post_add 
test 
1 

hoàn hảo! Và khi tôi thêm thẻ vào mục nhập trong quản trị viên, tôi nhận được thông tin sau (giữa các công cụ HTTP):

pre_clear 
post_clear 
pre_add 
post_add 
test 
1 

vẫn còn tốt! không chắc chắn những gì pre/post_clear đã được gọi cho ... và khi tôi xóa:

pre_clear 
post_clear 

argh! pre/post_remove không được gọi! trước/post_clear là vô ích cũng như nó không cung cấp bất kỳ khóa chính. điều này giống như một lỗi trong việc triển khai quản trị viên. bất kỳ đề xuất?

Cập nhật: Bug #16073 được gửi và chấp nhận.

+1

Vui lòng trả lời câu hỏi của bạn. – jpic

+0

Lỗi đã được đánh dấu là trùng lặp với [# 6707] (https://code.djangoproject.com/ticket/6707) vì đó là một triệu chứng của vấn đề ban đầu. – rbanffy

Trả lời

2

(Tạo trang này làm wiki cộng đồng để đóng câu hỏi này dưới dạng câu hỏi "chưa được trả lời").

Đây là lỗi trong Django. OP đã nộp một vé tại https://code.djangoproject.com/ticket/16073.

+0

Rất tiếc, không kiểm tra lại sau một thời gian. Cảm ơn bạn đã trả lời. –

Các vấn đề liên quan