在我的问题中,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
答案 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
中的对象。