Django多对多关系场景下如何筛选去重关联用户并获取用户名?
解决方案
首先你模型里存在一处笔误,Workout类的member字段外键关联写的是Membro,属于拼写错误,实际关联的是Member类,先修正这个问题。
方案1:直接查询关联了训练计划的Member对象(推荐)
你需要的本质是所有存在至少一条训练计划的去重用户,不需要从Workout表反向查,直接查Member表过滤即可,效率更高,返回的是完整的Member对象:
from django.db.models import Exists, OuterRef members_with_workout = Member.objects.filter( Exists(Workout.objects.filter(member=OuterRef('pk'))) )
遍历这个查询集就能直接拿到每个Member的完整属性,用户名称可以通过member.user.username获取,完全符合你渲染列表的需求。
方案2:从Workout表反向查询去重结果
如果你一定要从Workout侧查询,可以使用values_list配合关联字段跨表取属性,再去重:
# 返回(用户id, 用户名)的去重元组结果 distinct_users = Workout.objects.values_list( 'member_id', 'member__user__username' ).distinct()
如果需要完整的Member对象,也可以用下面的写法:
distinct_members = Member.objects.filter( id__in=Workout.objects.values_list('member_id', flat=True).distinct() )
模板渲染示例
拿到用户查询集之后,模板里可以直接生成点击跳转的入口:
{% for member in members_with_workout %} <div> <a href="/workout/list/{{ member.id }}/">{{ member.user.username }}</a> </div> {% endfor %}
点击跳转后的页面再根据传入的member_id查询该用户的所有训练计划即可:
# 跳转后页面的查询逻辑 user_workouts = Workout.objects.filter(member_id=传入的目标用户id)
内容的提问来源于stack exchange,提问作者overclock
相关产品推荐
相关产品推荐

