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

Django字典存储查询数据丢失及模板列表过滤问题求助

Django QuerySet遍历:字典去重与模板列表过滤问题

在遍历Django的QuerySet时,用字典存储结果会覆盖重复key的旧数据(比如供应商ID为5的两条记录,字典只保留最后一条),但用列表存储能保留所有数据:

字典实现及结果

dict_today_open_hour = {}
for t in v.today_opening_hours:      
    dict_today_open_hour.update({t.vendor.id:{'today_from_hour': t.from_hour, 'today_to_hour': t.to_hour,}})

结果:

{1: {'today_from_hour': '07:00', 'today_to_hour': '20:00'}, 5: {'today_from_hour': '22:00', 'today_to_hour': '23:00'}}

列表实现及结果

list_today_open_hour = []
for t in v.today_opening_hours:
    list_today_open_hour.append({t.vendor.id:{'today_from_hour': t.from_hour, 'today_to_hour': t.to_hour,}})      

结果:

[{1: {'today_from_hour': '07:00', 'today_to_hour': '20:00'}}, {5: {'today_from_hour': '09:00', 'today_to_hour': '19:00'}}, {5: {'today_from_hour': '22:00', 'today_to_hour': '23:00'}}]

问题1:如何让字典存储所有查询数据?

可以将字典的value设置为列表,同一个供应商ID对应的多条营业时间会被收集到列表中,不会被覆盖。代码实现如下:

dict_today_open_hour = {}
for t in v.today_opening_hours:
    vendor_id = t.vendor.id
    # 若供应商ID不在字典中,先初始化空列表
    if vendor_id not in dict_today_open_hour:
        dict_today_open_hour[vendor_id] = []
    # 将当前营业时间添加到对应供应商的列表里
    dict_today_open_hour[vendor_id].append({
        'today_from_hour': t.from_hour,
        'today_to_hour': t.to_hour
    })

最终字典结构:

{
    1: [{'today_from_hour': '07:00', 'today_to_hour': '20:00'}],
    5: [
        {'today_from_hour': '09:00', 'today_to_hour': '19:00'},
        {'today_from_hour': '22:00', 'today_to_hour': '23:00'}
    ]
}

这种结构既保留了按供应商ID快速查找的特性,又能存储该供应商的所有营业时间。


问题2:如何在Django模板中用列表按供应商ID过滤?

你之前的模板代码错误在于,列表里的每个元素是单个key-value的字典,无法用l.0或l.1直接取值。需要遍历字典的items来获取供应商ID和对应的营业时间:

{% for item in list_today_open_hour %}
    {% for vendor_id, hours in item.items %}
        {% if vendor_id == vendor.id %}
            {{ hours.today_from_hour }} - {{ hours.today_to_hour }}
        {% endif %}
    {% endfor %}
{% endfor %}

如果想简化模板逻辑,建议在视图层将列表转换为问题1中的字典结构,这样在模板中可以直接通过供应商ID访问,无需嵌套循环:

{# 假设视图传入的是dict_today_open_hour #}
{% for hours in dict_today_open_hour.vendor.id %}
    {{ hours.today_from_hour }} - {{ hours.today_to_hour }}
{% endfor %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:54:54