保存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()
由于上述简单的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
信号可以用来监视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()
方法中解决此问题,我会很高兴远离信号-但我陷于困境...