【问题标题】:Trigger signal when add relation to model向模型添加关系时触发信号
【发布时间】:2017-03-09 08:27:37
【问题描述】:

鉴于以下模型,已经创建了四个实例(A、B、C、D),我想在将公司添加到实例 D 时触发一个钩子。

    class Foo(models.Model):
        name = models.CharField()
        description = models.TextField()
        company = models.ManyToManyField(Company)

我曾考虑过使用 post_save 信号,但我不确定这是否是一个好方法。

【问题讨论】:

  • 我的错误,我更新了我的答案!

标签: django django-models


【解决方案1】:

对不起,我的错。我误解了你的问题。如果您想要处理 m2m 字段的保存,最佳做法是使用 m2m_changed 信号。

一般来说,使用信号是一种很好的做法。这就是它们被创建的原因之一!

@receiver(m2m_changed, sender=Foo.company.through)
def handler(sender, instance, pk_set, action, **kwargs):
    if instance.name == 'D' and action == 'post_add' and instance.company is not None:
        ...

【讨论】:

    【解决方案2】:

    尝试使用内置的预保存信号。这样您就可以获取 D 实例并检查“公司”字段是否即将更改。然后添加一个钩子。

    @receiver(pre_save, sender=Foo)
    def foo_pre_save(sender, instance, **kwargs):
        try:
            foo = Foo.objects.get(name=D_name)
            if((foo.company == None) and (instance.company != None)):
                # do your hook here
        except Foo.DoesNotExist:
            # handle exception
    

    【讨论】:

      猜你喜欢
      • 2014-08-17
      • 2015-12-09
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多