Django 多对多和 post_save 处理
Django multiple many to many and post_save processing
我有一个包含多个多对多字段的模型:
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
class 并让我的模型继承它,这样我就可以捕捉到信号..
但是 Django 将信号发送到哪里?我怎样才能覆盖它?老实说,我不知道,我也没有在文档中搜索,所以很抱歉,如果它已经存在但我没有看到它。
我用了<a href="https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed" rel="nofollow">m2m_changed</a>
单独处理
def topics_changed(sender, instance, **kwargs):
# Do something
m2m_changed.connect(topics_changed, sender=Article.topics.through)
authors
也是
我终于做到了,方法如下:
我创建了一个新信号
import django.dispatch
m2m_post_save = django.dispatch.Signal(providing_args=["instance"])
然后我创建了 ModelAdmin class 的子class,它在完成保存相关元素后触发它:
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 class 子class 我的 ModelAdmin class 并将信号连接到我的方法。
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)
我有一个包含多个多对多字段的模型:
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
class 并让我的模型继承它,这样我就可以捕捉到信号..
但是 Django 将信号发送到哪里?我怎样才能覆盖它?老实说,我不知道,我也没有在文档中搜索,所以很抱歉,如果它已经存在但我没有看到它。
我用了<a href="https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed" rel="nofollow">m2m_changed</a>
单独处理
def topics_changed(sender, instance, **kwargs):
# Do something
m2m_changed.connect(topics_changed, sender=Article.topics.through)
authors
也是
我终于做到了,方法如下: 我创建了一个新信号
import django.dispatch
m2m_post_save = django.dispatch.Signal(providing_args=["instance"])
然后我创建了 ModelAdmin class 的子class,它在完成保存相关元素后触发它:
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 class 子class 我的 ModelAdmin class 并将信号连接到我的方法。
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)