编辑 Many_to_many 字段时避免 Django 中的重复信号

Cor*_*ady 4 python django django-signals django-models

我想自动更新有关模型更改的外部应用程序。问题在于数据在事件<->用户之间存在多对多关系。我尝试使用“m2m_changed”信号

@receiver(m2m_changed, sender=models.Event.organisers.through)
def event_changed(sender, instance, action, *args, **kwargs):
    if "post" in action:
      # hey api here is the new list of organisers of this
Run Code Online (Sandbox Code Playgroud)

问题在于,如果我进行一项更改,删除一个用户并添加另一个用户,那么该代码将被调用两次!这不好,我不能忽略一种类型的操作,以防仅调用该操作。我曾想过将实例推入堆栈并忽略重复项,但这看起来很混乱。有没有办法让我自己的信号只触发一次?

Muh*_*lan 5

Djangom2m_changed指示 ManyToMany 模型上的更改。如果有 4 个动作

  1. 预添加
  2. 后添加
  3. 预删除
  4. 删除后

因此,如果您只是添加用户,则此 m2m_changed 方法将分别触发 2 次,分别为pre_addpost_add

您可以指定要在哪个操作中调用 API。这可以这样做:

    @receiver(m2m_changed, sender=models.Event.organisers.through)
    def event_changed(sender, instance, action, *args, **kwargs):
    if kwargs.get('action') == 'pre_add': # Or whatever action you want
       # Call your API here
Run Code Online (Sandbox Code Playgroud)

参考 Django 文档:https://docs.djangoproject.com/en/2.2/ref/signals/#m2m-changed