在Django 1.9中,我有一个包含汽车品牌的数据库表。我正试图建立一个汽车品牌的索引(就像教科书后面的一个索引)。例如:
A
阿斯顿马丁
奥迪
...
的乙
宾利
BMW
...
以下是我的 view.py :
中的代码def home(request):
car_index = {}
alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z']
for letter in alphabet:
car_index[letter] = {}
car_index[letter]['title'] = letter
car_index[letter]['brands'] = Cars.objects.filter(brand__startswith = letter)
return render(request, 'cars/home.html', {'car_index':car_index})
以下是我的 home.html 模板中的代码:
{% for each in car_index %}
{{ each.title }}
{% for brand in each.brands %}
<a href="{{ brand.link }}">{{ brand.name }}</a><br>
{% endfor %}
{% endfor %}
在view.py中,我在模板上下文中的查询集.values()
中尝试了.items()
。在模板中,我尝试了car_index.items
,each.brands.items
,each.brands[0]
。什么都行不通。使用上面的代码,我得到标题:E D X I A U H B T S N K Q Z Y W V O L R F G P C M,但没有链接。 (我知道如何排序,但首先处理链接)
我读过:
https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#for
how to iterate through dictionary in a dictionary in django template?
答案 0 :(得分:3)
更好的方法 - 更清洁的代码,除了数据库效率:
alphabet = ['A','B','C','D','E','F','G', ..]
brands_list = []
for letter in alphabet:
letter_ = {'cars': Cars.objects.filter(brand__startswith=letter), 'letter': letter}
brands_list.append(letter_)
return render(request, 'cars/home.html', {'brands': brands_list})
模板
{% for brand in brands %}
{{ brand.letter }}
{% for car in brand.cars %}
<a href="{{ car.link }}">{{ car.name }}</a><br>
{% endfor %}
{% endfor %}
答案 1 :(得分:2)
我可以阻止你摆脱目前的做法吗?
您正在以26个步骤进行全表扫描。如果品牌列不是唯一的,您会发现名称会重复出现。如果你有数百万条记录,你将耗尽内存。如果品牌列没有索引,您会发现以下查询非常慢:
Cars.objects.filter(brand__startswith = letter)
有一个非常简单的解决方案。这也可能涉及全表扫描,但至少你执行一个慢查询而不是26。
Cars.objects.raw('SELECT max(id), SubStr(brand,1,1) AS letter, brand
FROM myapp_cars GROUP BY substr(brand,1,1)')
这是使用原始查询。如果你不喜欢它们并碰巧幸运地使用Postgresql,你可以使用distinct来更客观地实现同样目标。
答案 2 :(得分:1)
我很高兴我的评论帮助你以某种方式解决了你的问题。 我只是将它作为答案发布,以便它可以帮助其他人。
{% for each in car_index %}
,只是迭代掉当前的 dict 并且不解包 dicts 的 dict ,这是品牌< EM>字典
由于car_index上下文包含字典,以下内容将显示car_index字典的键和值,并解开品牌字典。
{% for key,value in car_index.items %}
{{ value.title }}
{% for brand in value.brands %}
<a href="{{ brand.link }}">{{ brand.name }}</a><br>
{% endfor %}
{% endfor %}