在Django中,如何在Group添加或删除用户时获取信号?

fas*_*ion 3 django django-models django-admin

在Django管理员中,我有时会向(现有)组添加或删除用户.当发生这种情况时,我希望能够运行一个功能.

我只是使用标准的用户和组模型.

我已经看过用信号做这个,通过m2m_changed,但它似乎需要一个通过类 - 我不认为在这种情况下有一个.

Bou*_*uke 6

来自django doc:

sender - 描述ManyToManyField的中间模型类.定义多对多字段时,将自动创建此类; 您可以使用多对多字段中的through属性访问它.

订阅m2m_changed时如下:

@receiver(m2m_changed)
def my_receiver(**kwargs):
    from pprint import pprint
    pprint(kwargs)
Run Code Online (Sandbox Code Playgroud)

你会收到一堆像这样的信号(缩短):

{'sender': <class 'django.contrib.auth.models.User_groups'>,
 'action': 'post_add',
 'instance': <User: bouke>,
 'model': <class 'django.contrib.auth.models.Group'>,
 'pk_set': set([1]),
 'reverse': False,
 'signal': <django.dispatch.dispatcher.Signal object at 0x101840210>,
 'using': 'default'}
Run Code Online (Sandbox Code Playgroud)

所以用户bouke已被添加到pk_set组:[1].不过我注意到,管理员布局清除所有的组,然后将所选组回.您将收到的的信号pre_clear,post_clear,pre_add,post_add.使用这些信号的组合,您可以存储前后组.对这些列表进行差异处理,您可以为用户添加已删除和添加的组.

请注意,在编辑组而不是用户时,信号是相反的(pk_setinstance).


ApP*_*PeL -2

尝试使用 来实现这一点可能会更好django-celery,这样您就可以编写自定义任务,并且根据特定条件(例如删除或添加)您可以触发特定任务。