Django has_perm仅能判断调用那一刻的权限信息

文章讲述了在Django框架下创建自定义权限并将其分配给用户的过程。通过`Permission.objects.create`创建权限,然后使用`user_permissions.add`添加到用户。然而,发现使用`has_perm`检查权限时,需要重新查询用户才能得到正确的结果。解决方案包括直接根据权限的codename进行查询。
摘要由CSDN通过智能技术生成
# 创建自定义权限
>>> Permission.objects.create(name='自定义的权限',codename='lala',content_type=c)
<Permission: statusTask | detection task model | 自定义的权限>

# 查询验证
>>> for i in Permission.objects.filter(content_type=c):print(i.__dict__)
... 
{'_state': <django.db.models.base.ModelState object at 0x7ff46a1df1c0>, 'id': 25, 'name': 'Can add detection task model', 'content_type_id': 7, 'codename': 'add_detectiontaskmodel'}
{'_state': <django.db.models.base.ModelState object at 0x7ff46a1df400>, 'id': 26, 'name': 'Can change detection task model', 'content_type_id': 7, 'codename': 'change_detectiontaskmodel'}
{'_state': <django.db.models.base.ModelState object at 0x7ff46a1df3d0>, 'id': 27, 'name': 'Can delete detection task model', 'content_type_id': 7, 'codename': 'delete_detectiontaskmodel'}
{'_state': <django.db.models.base.ModelState object at 0x7ff46a1dfaf0>, 'id': 41, 'name': '自定义的权限', 'content_type_id': 7, 'codename': 'lala'} # 新的自定义权限已经有啦
{'_state': <django.db.models.base.ModelState object at 0x7ff46a1df8e0>, 'id': 28, 'name': 'Can view detection task model', 'content_type_id': 7, 'codename': 'view_detectiontaskmodel'}

# 查询某用户当前权限集合
>>> he.user_permissions.all()
<QuerySet [<Permission: statusTask | detection task model | Can view detection task model>]>
# 添加自定义权限
>>> he.user_permissions.add(Permission.objects.get(content_type=c,codename='lala'))
# 查询验证,可以查到最新的
>>> he.user_permissions.all()
<QuerySet [<Permission: statusTask | detection task model | 自定义的权限>, <Permission: statusTask | detection task model | Can view detection task model>]>

# 但很坑的是,这种一个也查不到(读权限也是he查询出来后添加的)
>>> he.has_perm('statusTask.lala')
False
>>> he.has_perm('statusTask.view_detectiontaskmodel')
False
>>> he.__dict__
{'_state': <django.db.models.base.ModelState object at 0x7ff46c99ec80>, 'id': 2, 'password': 'pbkdf2_sha256$390000$5IRgac5SsYOy2Qp1v2SE66$F5nJ6XgY25pq+rv8UxWBM/WApU1RiSlPgmws6CtDqOc=', 'last_login': None, 'is_superuser': False, 'username': 'hehe', 'first_name': '', 'last_name': '', 'email': '', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2023, 7, 13, 15, 26, 34, 890713), 'backend': 'django.contrib.auth.backends.ModelBackend', '_user_perm_cache': set(), '_group_perm_cache': set(), '_perm_cache': set()}

# 重新查询该用户即可
>>> he2=UserModel.objects.get(id=2)
>>> he2.has_perm('statusTask.view_detectiontaskmodel')
True
>>> he2.has_perm('statusTask.lala')
True

解决方法除了实时查询user,还可根据权限的codename查询

>>> 'lala' in [i['codename'] for i in he.user_permissions.values('codename')]

True

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值