Python 获取用户列表以及组成员资格?

Python 获取用户列表以及组成员资格?,python,django,Python,Django,我希望获得一个queryset以及他们的组成员资格,以避免昂贵的额外数据库访问,并使模板中的内容管理更加容易 最初,我尝试预取用户所属的组: def get_queryset(self): User.objects.filter(is_active=True).prefetch_related('groups') 但这样就很难根据组在模板中显示和隐藏内容: {{ user.groups.all }} 给予 这工作正常,但给了我一个错误: Expression #2 of SELECT

我希望获得一个queryset以及他们的组成员资格,以避免昂贵的额外数据库访问,并使模板中的内容管理更加容易

最初,我尝试预取用户所属的组:

def get_queryset(self):
    User.objects.filter(is_active=True).prefetch_related('groups')
但这样就很难根据组在模板中显示和隐藏内容:

{{ user.groups.all }}
给予

这工作正常,但给了我一个错误:

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'my_site.auth_group.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
但在模板中易于使用,包括:

{% if user.is_manager %} Manager {% else %} Normal user {% endif %}
有更简单的方法吗

编辑:

最后一个问题是:

self.model.objects.prefetch_related('groups').all().annotate(
            is_manager=Case(
                When(
                    groups__id__exact=1, then=True
                ), default=False, output_field=BooleanField()
            )
        ).values("pk", "id", "email", "is_manager")

你的方法很好

首先,如果可能的话,考虑使用组ID而不是组名来识别管理者。将显著提高查询性能和与拼写相关的错误

下面是我尝试过的一个快速片段,它正在为我工作。在博士后

User.objects.prefetch_related("groups").annotate(
    is_super=Case(
        When(
            groups__id__in=[1, 2,3 ], then=1
        ), default=0, output_field=IntegerField()
    )
).order_by("id").values_list("id", "username", "is_super")

啊,我得到了一个与SQL相关的错误:SELECT列表的表达式2不在GROUPBY子句中,并且包含未聚合的列“example\u db.users\u user\u groups.GROUP\u id”,它在功能上不依赖GROUPBY子句中的列;这与sql_mode=only_full_group_byinterest不兼容,@surfer190您可以尝试在查询中按group_id添加group_吗?可以通过添加.valuesAh来完成。我在输出表需要pk时遇到错误,因此只将其添加到值:.valuespk,id,email,is_manager。我会接受你的回答,并用我的确切查询编辑问题。没有办法返回查询集吗?@surfer190是的。您可以从末尾删除.value。你会得到一个普通的查询集。您应该能够像user.is\u manager一样访问带注释的列
self.model.objects.prefetch_related('groups').all().annotate(
            is_manager=Case(
                When(
                    groups__id__exact=1, then=True
                ), default=False, output_field=BooleanField()
            )
        ).values("pk", "id", "email", "is_manager")
User.objects.prefetch_related("groups").annotate(
    is_super=Case(
        When(
            groups__id__in=[1, 2,3 ], then=1
        ), default=0, output_field=IntegerField()
    )
).order_by("id").values_list("id", "username", "is_super")