python - Django多个多对多和post_save处理

标签 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 将信号发送到哪里呢?我怎样才能覆盖它?老实说,我不知道,而且我没有在文档中进行搜索,所以如果它已经存在但我没有看到它,我深表歉意。

最佳答案

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

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)

关于python - Django多个多对多和post_save处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33733570/

相关文章:

Python Reddit API : efficiently parse all comments in a subreddit

python - 在 django admin 中按天分组?

python - Django 的 Q 对象的相等性

javascript - 我该如何修复错误 Uncaught ReferenceError : addEvent is not defined

python - Django-admin:无法访问管理后端 "attempt to write a readonly database"

python - 如何在 Django Rest Framework 中从两个模型编辑用户配置文件并保存更改

中继器的 Python 问题

Python-生成特定自相关的数组

python - 找出差异,Celery 任务随机失败且没有错误

mysql - Django:由于没有 admin.py 而遇到麻烦