Django:在post_save信号中没有更新m2m关系

时间:2013-11-27 17:27:34

标签: django django-signals django-postgresql

在我的问题中,m2m关系没有在post_save信号中更新。

我有一个post_save检查以确保用户是一名工作人员,如果他们没有默认权限,则会为他们分配默认权限。如果用户不是员工,则确认他们没有默认权限。

def user_post_save(sender, instance, **kwargs):
    """
        If the user is staff and they don't have default auth permissions
        assign them.
    """
    group_ids = [g.id for g in instance.groups.all()]
    if instance.is_staff and 1 not in group_ids:
        # give them default auth permissions.
        instance.groups.add(1)
    elif not instance.is_staff and 1 in group_ids:
        # if they are not staff and they have the permission, remove it.
        instance.groups.remove(1)

post_save.connect(user_post_save, sender=User)

问题是instance.groups使用正确的预期值使其到达user_post_save的末尾,但是它不会在db中更新。我错过了什么?

提前感谢您的帮助!


更多信息:我正在玩游戏并从具有默认权限的用户手中夺走了员工状态。当我查看postgres日志时,我注意到以下内容:

LOG:  statement: DELETE FROM "auth_user_groups" WHERE "auth_user_groups"."user_id" = 8

稍后的几句话......

LOG:  statement: INSERT INTO "auth_user_groups" ("user_id", "group_id") VALUES (8, 1)

因此,它被正确删除,只有一些东西导致它再次插入?


更新

这是回购/分支:https://github.com/jaycrossler/geoq-django/tree/guardian_setup/geoq
以下是信号的具体位置:https://github.com/jaycrossler/geoq-django/blob/guardian_setup/geoq/accounts/models.py

1 个答案:

答案 0 :(得分:1)

是否只有使用django.admin应用程序才会发生? 您可以更改用户状态并将其保存在自己的应用程序中吗? 因为django内置管理员会执行以下操作:

在文件 django.contrib.admin.options.py 中 功能 change_view 约为1053行

if all_valid(formsets) and form_validated:
    self.save_model(request, new_object, form, True)
    self.save_related(request, form, formsets, True)
    change_message = self.construct_change_message(request, form, formsets)
    self.log_change(request, new_object, change_message)
    return self.response_change(request, new_object)

self.save_related(request, form, formsets, True)保存对象后执行第self.save_model(request, new_object, form, True)行,成功删除保存在user_post_save中的对象。