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
相关产品推荐
相关产品推荐

