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.
Vui lòng trả lời câu hỏi của bạn. – jpic
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