除组之外的权限
Permissions except for a group
在下面的查询中,我得到了所有权限的列表。
routines = (
Permission.objects.select_related("content_type")
.values("id", "name", "content_type__app_label", "content_type__model", )
.order_by("content_type__app_label")
)
查询return:
accounts | accountsroutine | Can add accounts routine
accounts | accountsroutine | Can change accounts routine
accounts | accountsroutine | Can delete accounts routine
accounts | accountsroutine | Can view accounts routine
我需要更改此查询以从中排除已授予特定组的权限。如何制作?
使用原始查询解决,带有 NOTING IN 子句。
示例:
# Get permissions group
group = Group.objects.get(id=pk)
permissions = (
group.permissions.all()
.values("id")
)
# Make list with group permission id
selected = []
for permission in permissions:
selected.append(permission["id"])
selected = tuple(selected)
# Sql to get routines and permissions
sql = """
SELECT
accounts_routine.accounts_routine_id,
accounts_routine.name AS routine_name,
auth_permission.id,
auth_permission.name AS permission_name
FROM
accounts_routine
INNER JOIN
django_content_type
ON
accounts_routine.django_content_type_id = django_content_type.id
inner join
auth_permission
on
auth_permission.content_type_id = django_content_type.id
"""
# Not list permissions authorized
if len(selected) == 1:
sql = """{} {} {}""".format(
sql,
"WHERE auth_permission.id != ",
selected[0]
)
elif len(selected) > 1:
sql = """{} {} {}""".format(
sql,
"WHERE auth_permission.id NOT IN",
selected
)
# Remove extra space
sql = sql.replace(" ", " ")
# Get routines
routines = AccountsRoutine.objects.raw(sql)
在下面的查询中,我得到了所有权限的列表。
routines = (
Permission.objects.select_related("content_type")
.values("id", "name", "content_type__app_label", "content_type__model", )
.order_by("content_type__app_label")
)
查询return:
accounts | accountsroutine | Can add accounts routine
accounts | accountsroutine | Can change accounts routine
accounts | accountsroutine | Can delete accounts routine
accounts | accountsroutine | Can view accounts routine
我需要更改此查询以从中排除已授予特定组的权限。如何制作?
使用原始查询解决,带有 NOTING IN 子句。
示例:
# Get permissions group
group = Group.objects.get(id=pk)
permissions = (
group.permissions.all()
.values("id")
)
# Make list with group permission id
selected = []
for permission in permissions:
selected.append(permission["id"])
selected = tuple(selected)
# Sql to get routines and permissions
sql = """
SELECT
accounts_routine.accounts_routine_id,
accounts_routine.name AS routine_name,
auth_permission.id,
auth_permission.name AS permission_name
FROM
accounts_routine
INNER JOIN
django_content_type
ON
accounts_routine.django_content_type_id = django_content_type.id
inner join
auth_permission
on
auth_permission.content_type_id = django_content_type.id
"""
# Not list permissions authorized
if len(selected) == 1:
sql = """{} {} {}""".format(
sql,
"WHERE auth_permission.id != ",
selected[0]
)
elif len(selected) > 1:
sql = """{} {} {}""".format(
sql,
"WHERE auth_permission.id NOT IN",
selected
)
# Remove extra space
sql = sql.replace(" ", " ")
# Get routines
routines = AccountsRoutine.objects.raw(sql)