如何使用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
相关产品推荐
相关产品推荐

