Django多对多和post_save处理

时间:2015-11-16 10:52:01

标签: python django django-admin django-signals

我的模型包含多个多个字段:

class Author(models.Model):
    name = models.CharField(max_length=30)

class Topic(models.Model):
    description = models.CharField(max_length=30)

class Article(models.Model):
    authors = models.ManyToManyField(Author, related_name='articles')
    topics = models.ManyToManyField(Topic, related_name='articles')

我需要一些非常简单的东西:

保存文章后要执行的方法,我可以访问该实例的作者和主题。

我的第一次尝试是使用post_save信号,但是当模型本身被保存时,信号被触发,而不是在保存关系之后,这显然来自直通模型。

经过一些在线阅读后,我意识到我可能需要创建自己的信号并连接到它。问题是我不知道要覆盖什么以及在哪里发射该信号。

因为我需要在多个模型上使用它,我想我可以创建一些M2MPostSaveModel类并让我的模型继承它,这样我就可以捕获信号..

但是Django在哪里发送信号?我怎么能覆盖它?我真的不知道,我没有运气搜索文档,所以道歉,如果它已经存在,我没有看到它。

2 个答案:

答案 0 :(得分:2)

我终于做到了,这里的方法如下: 我创建了一个新信号

import django.dispatch
m2m_post_save = django.dispatch.Signal(providing_args=["instance"])

然后我创建了一个ModelAdmin类的子类,它在完成相关元素的保存后触发它:

class M2MPostSaveModelAdmin(ModelAdmin):

    def save_related(self, request, form, formsets, change):
        super(M2MPostSaveModelAdmin, self).save_related(request, form, formsets, change)
        m2m_post_save.send(sender=self.__class__, instance=form.instance)

现在我要做的就是用我的M2MPostSaveModelAdmin类继承我的ModelAdmin类,并将信号连接到我的方法。

def doo_something_with_updated_instance(instance, **kwargs):
    # Here your instance has all the m2m relationships updated

m2m_post_save.connect(doo_something_with_updated_instance sender=YourModelAdminClass)

答案 1 :(得分:0)

我使用m2m_changed进行单独处理。

def topics_changed(sender, instance, **kwargs):
    # Do something

m2m_changed.connect(topics_changed, sender=Article.topics.through)

同样适用于authors