保存模型和相关的m2m(组)字段后如何触发动作?

时间:2019-05-13 20:11:59

标签: python django m2m

保存Django用户模型后如何做,包括对django.contrib.auth.models.Group之类的m2m字段进行相关更改?

情况

我有一个自定义的Django用户模型,并希望在用户实例(具有相关更改,例如m2m组成员身份)成功保存到数据库后触发一些操作。 这里的用例是Wagtail CMS,其中我为每个用户实例创建ProfilePage。根据用户实例的组成员身份,我需要做一些事情。

问题

在自定义模型save()方法中,我无法引用已更改的组成员身份,因为m2m的成员身份是在保存用户实例后保存的。即使在super().save()调用之后运行我的自定义函数,新的组成员也不可用。 但是我需要获取新的组成员身份,以便根据该用户的新组来执行某些操作。

我尝试过的

[✘]自定义模型save()

# file: users/models.py
class CustomUser(AbstractUser):
    super().save(*args, **kwargs)
    do_something()

[✘]信号post_save

由于上述简单的save()方法无法解决问题,因此我尝试了用户模型的post_save信号:

# file users/signals.py
@receiver(post_save, sender=get_user_model())
def handle_profilepage(sender, instance, created, **kwargs):
    action = 'created' if created else 'updated'
    do_something()

...但是即使在这里,我也总是从组成员资格中获得“旧”值。

[✔]信号:m2m_changed

我了解到有一个m2m_changed信号可以用来监视Users.groups(.through)表的更改。

我的以下实现实现了我所需要的:

@receiver(m2m_changed, sender=User.groups.through)
def user_groups_changed_handler(sender, instance, **kwargs):
    USER_GROUPS = instance.groups.values_list('name', flat=True)
    if set(USER_GROUPS) & set(settings.PROFILE_GROUPS):
        do_something_because_some_groups_match()
    else:
        do_something_else()

我的收藏夹

如果有机会在模型save()方法中解决此问题,我会很高兴远离信号-但我陷于困境...

0 个答案:

没有答案