我有一個奇怪的問題,使用itertools.groupby
來分組查詢集的元素。我有一個模型Resource
:itertools.groupby在Django模板
from django.db import models
TYPE_CHOICES = (
('event', 'Event Room'),
('meet', 'Meeting Room'),
# etc
)
class Resource(models.Model):
name = models.CharField(max_length=30)
type = models.CharField(max_length=5, choices=TYPE_CHOICES)
# other stuff
我有一對夫婦的資源在我的SQLite數據庫:
>>> from myapp.models import Resource
>>> r = Resource.objects.all()
>>> len(r)
3
>>> r[0].type
u'event'
>>> r[1].type
u'meet'
>>> r[2].type
u'meet'
所以,如果我按類型分組,我自然會得到兩個元:
>>> from itertools import groupby
>>> g = groupby(r, lambda resource: resource.type)
>>> for type, resources in g:
... print type
... for resource in resources:
... print '\t%s' % resource
event
resourcex
meet
resourcey
resourcez
現在我在我看來有同樣的邏輯:
class DayView(DayArchiveView):
def get_context_data(self, *args, **kwargs):
context = super(DayView, self).get_context_data(*args, **kwargs)
types = dict(TYPE_CHOICES)
context['resource_list'] = groupby(Resource.objects.all(), lambda r: types[r.type])
return context
但是,當我遍歷這個在我的模板,一些資源缺失:
<select multiple="multiple" name="resources">
{% for type, resources in resource_list %}
<option disabled="disabled">{{ type }}</option>
{% for resource in resources %}
<option value="{{ resource.id }}">{{ resource.name }}</option>
{% endfor %}
{% endfor %}
</select>
這使得爲:
我想以某種方式subiterators被遍歷已,但我不確定這會如何發生。
(使用python 2.7.1,Django 1.3)。
(編輯:如果有人讀取此,我建議使用內置regroup
template tag而不是使用groupby
)
感謝您的調查;我用~10資源試了一下,每個組最多隻有一個資源 - 我用'(t,list(r))爲上下文填充t,r在groupby(...)中進行了修復' –
是的,迭代器正在進行預迭代,Django將迭代器轉換爲列表而無需遍歷分組項。我在一個單獨的答案中添加了解釋。 –