You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Django ORM正确获取所有分组及可选关联用户记录

Django ORM 实现对应SQL查询方案

你写的原生SQL逻辑是:查询ID为3的用户关联的所有权限组,同时返回所有未绑定任何用户的空权限组,结果包含组ID、组名、关联用户名三个字段。

直接使用Django内置的Auth模型配合ORM查询即可实现完全一致的效果:

  • 导入依赖模块
from django.contrib.auth.models import Group
from django.db.models import F, Q
  • 执行ORM查询
result = Group.objects.annotate(
    username=F('user__username')
).filter(
    Q(user__id=3) | Q(user__id__isnull=True)
).values('id', 'name', 'username')

逻辑说明

  • 查询从auth_group主表出发,annotate通过关联关系取auth_user表的username字段,ORM会自动按逻辑依次左连中间表auth_user_groups、用户表auth_user,和你手写SQL的连表顺序、连接类型完全一致
  • 过滤条件用Q对象实现OR逻辑:匹配关联用户ID为3的组,同时保留没有任何关联用户的组(关联用户ID为NULL)
  • values()指定返回字段,和你原生SQL查询返回的字段一一对应。你可以执行print(result.query)打印生成的SQL语句,和手写版本对比,执行结果完全一致。

如果不需要返回字典结构、需要直接操作Group模型实例,去掉末尾的.values()调用即可,username会作为Group实例的附加属性直接访问。

注:如果使用Django 1.11以下的极旧版本出现ORM自动将左连接转为内连接的异常,可以显式指定左连接规则,目前所有仍在维护周期内的Django版本都不需要额外处理。

内容的提问来源于stack exchange,提问作者Dallas Caley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:36:33