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

如何合并Django QuerySet结果,归集匹配键对应的值?

问题描述

我在Django的views.py中编写了如下代码:

context['user'] = User.objects.filter(code='01').values('name', 'phone')
print(context['user'])

输出的QuerySet结果为:

<QuerySet [{'name': 'John', 'cellphone': '1234567890'}, {'name': 'Doe', 'cellphone': '1234512345'}]>

原本我在模板里用循环渲染内容:

{% for u in user %}
 <span>name :</span> <span> {{ u.name }} / </span>
 <span>cellphone :</span> <span> {{ u.cellphone }}</span>
{% endfor %}

但我想要的输出格式是:
name : John, Doe / cellphone : 1234567890, 1234512345

解决方案

方案一:在视图层处理(推荐)

直接在视图中把所有用户名和手机号分别拼接成字符串,再传递给模板,这样模板逻辑更简单:

# 先获取用户数据
users = User.objects.filter(code='01').values('name', 'cellphone')
# 提取所有名字并用逗号分隔
user_names = ', '.join([item['name'] for item in users])
# 提取所有手机号并用逗号分隔
user_cellphones = ', '.join([item['cellphone'] for item in users])
# 把处理好的字符串传入上下文
context['user_names'] = user_names
context['user_cellphones'] = user_cellphones

然后在模板中直接渲染:

<span>name : {{ user_names }}</span> / <span>cellphone : {{ user_cellphones }}</span>

方案二:在模板层处理

如果不想修改视图,可以用Django模板的forloop特殊变量和字符串拼接来实现:

<span>name : {% for u in user %}{{ u.name }}{% if not forloop.last %}, {% endif %}{% endfor %}</span>
/
<span>cellphone : {% for u in user %}{{ u.cellphone }}{% if not forloop.last %}, {% endif %}{% endfor %}</span>

forloop.last会判断当前循环是否是最后一次,不是的话就添加逗号分隔符,最终就能得到想要的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:10:26