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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:45:04