# 创建自定义权限
>>> 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