除组之外的权限

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)