我有一个Django系统,它使用Guardian的用户对象权限.我想要编写一个函数,该函数可以查找与"旧"用户相关联的所有内容类型的所有权限,并将它们分配给"新"用户.我不能直接查询UserObjectPermission
,因为出于性能原因,我们的系统使用直接foreign key models.
这是example of what I want美元
from django.contrib.auth.models import User
from guardian.shortcuts import get_objects_for_user, assign_perm
def update_permissions_for_user(old_user, new_user):
# Retrieve all USER permission objects for the old user
# this throws exception because it requires a perms param that I do not want to provide. I want all objects across all models
old_user_permissions = get_objects_for_user(old_user, use_groups=False, any_perm=False, with_superuser=False, accept_global_perms=False)
# Iterate through each permission object and update it to point to the new user
for permission in old_user_permissions:
assign_perm(permission.codename, new_user, permission)
remove_perm(permission.codename, old_user, permission)
# Example usage:
old_user = User.objects.get(username='old_username') # Replace 'old_username' with the actual username
new_user = User.objects.get(username='new_username') # Replace 'new_username' with the actual username
update_permissions_for_user(old_user, new_user)
如果我们不使用直接外键模型,则代码将简单地为:
user_objects_permission_qs = UserObjectPermission.objects.filter(user=current_user)
affected_rows = user_objects_permission_qs.update(user=new_user)
然而,example of what I want的问题是get_objects_for_user
需要perms
参数.而且,根据《卫报》的文件
如果Sequence中存在多个权限,则它们的内容类型必须相同,否则将引发MixedContent TypeError异常.
因此,这不适用于具有不同内容类型的对象.有什么建议吗?我也考虑过使用get_user_perms,但这也需要一个对象参数.
下面是我们如何创建直接外键模型
class MyModelUserObjectPermission(UserObjectPermissionBase):
content_object = models.ForeignKey(MyModel, on_delete=models.CASCADE)