【问题标题】:Django multiple many to many and post_save processingDjango 多对多和 post_save 处理
【发布时间】:2015-11-16 10:52:00
【问题描述】:

我有一个包含多个多对多字段的模型:

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

【问题讨论】:

    标签: python django django-admin django-signals


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      我使用@987654321@进行单独处理。

      def topics_changed(sender, instance, **kwargs):
          # Do something
      
      m2m_changed.connect(topics_changed, sender=Article.topics.through)
      

      authors 也是如此

      【讨论】:

      • 我想过这个问题,但我对这个解决方案有两个问题:1)我的代码涉及这两个信息(我需要发送一封包含完整文章、作者和主题的电子邮件)。我可以让它们相互调用,并且只有在它们都完成后才执行“记录”部分,但这非常花哨且不可读。 2) 我宁愿有一个用自定义信号覆盖此行为的超类,这样我就不必多次编写此代码。我有其他需要这种行为的模型,因此拥有一个处理 m2m_post_save_signal 的超类是更可取的。
      • @XelharK 那是什么?
      • 如果你检查两者都填满了,然后发送带有完整文章的邮件
      • 你可能需要改变你的模型......除非......这是不可能的
      • 我应该如何更改我的模型?
      猜你喜欢
      • 2012-07-22
      • 2011-02-12
      • 2014-09-01
      • 2017-03-20
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2021-08-01
      相关资源
      最近更新 更多