如何在django中选择单个查询中的用户和组?

如何在django中选择单个查询中的用户和组?,django,django-orm,Django,Django Orm,在django中,在单个查询中选择用户和组时,我需要类似的东西 user = User.objects.select_related('groups').get(id=user_id) 我不想对此使用原始查询 还有另一种方法可以进行两个查询: user = User.objects.get(id=user_id) groups = user.groups 编辑:似乎除了原始sql或额外的之外,在一个查询中没有其他方法可以做到这一点 因此,如果您只想获得一个用户,那么您的第二个示例应该可以。

在django中,在单个查询中选择用户和组时,我需要类似的东西

user = User.objects.select_related('groups').get(id=user_id)
我不想对此使用原始查询

还有另一种方法可以进行两个查询:

user = User.objects.get(id=user_id)
groups = user.groups

编辑:似乎除了原始sql或
额外的
之外,在一个查询中没有其他方法可以做到这一点

因此,如果您只想获得一个用户,那么您的第二个示例应该可以。 如果有许多用户:


您应该在两个查询中使用

另一方面,prefetch_-related对每个关系执行单独的查找,并在Python中执行“连接”。这允许它预取多对多和多对一对象,这是使用select_-related无法完成的,此外,select_-related还支持外键和一对一关系。它还支持预取GenericRelation和GenericForeignKey

prefetch_related()中的附加查询是在开始计算查询集并执行主查询之后执行的


因此,如果您想预取
,它将执行两个查询,无论您是使用
all
还是
get
,您可以在视图中使用prefetch related,然后将其传递给模板

def view(request):
    user = User.objects.all().select_related(
    ).prefetch_related(
        'groups',
    ).get(pk=request.user.pk)
    return render(request, 'app/template.html', {
        'user': user,
    })

您应该从组模型中选择,因为关系是多对多的。 我还没有尝试过我的答案,但也许它会奏效

group\u list\u带有用户=group.objects.filter(用户=USERID.all()

此后,您可以访问分配给用户的所有组,例如访问用户

group_list_with_user[0].name  #  group name
group_list_with_user[0].user.first_name  # user's first name

你的第一个例子有什么问题?你只需要
user.groups.all()
你看过
prefetch\u related
了吗?它应该用于在一个查询中提取多对多关系。它可能执行两个查询,但是否比运行OP首先尝试的两行要慢?@Bobort它们应该是相同的,因为它们基本上做相同的事情。