我将尽可能详细地说明我遇到这个问题的背景。
模型:
class Schedule(models.Model):
id = models.AutoField(primary_key=True)
project = models.ForeignKey(ProjectSchedule, related_name='schedules')
person = models.ForeignKey(PersonSchedule, related_name='schedules')
week_date = models.DateField() # first day of the week
hours = models.IntegerField(default=0)
class Meta:
ordering = ['project']
unique_together = ('project', 'person', 'week_date')
def __unicode__(self):
return unicode("%s from %s schedule (%shs)" % (self.person, self.project, self.hours))
视图:
class ReportView(TemplateView):
start_year = None
start_month = None
start_day = None
start_week = None
end_year = None
end_month = None
end_day = None
end_week = None
def get(self, request, *args, **kwargs):
try:
self.start_year = int(kwargs.get('start_year'))
self.start_month = int(kwargs.get('start_month'))
self.start_day = int(kwargs.get('start_day'))
self.start_week = datetime.date(self.start_year, self.start_month, self.start_day)
self.end_year = int(kwargs.get('end_year'))
self.end_month = int(kwargs.get('end_month'))
self.end_day = int(kwargs.get('end_day'))
self.end_week = datetime.date(self.end_year, self.end_month, self.end_day)
def get_schedules(self):
return Schedule.objects.filter(week_date__range=[self.start_week, self.end_week])
def get_context_data(self, **kwargs):
context = super(ProjectsReportTableView, self).get_context_data(**kwargs)
context.update({'schedules': self.get_schedules()})
return context
模板:
<h2>Schedules by week</h2>
{% regroup schedules by week_date as schedules_grouped_by_week %}
{% for week_schedules_group in schedules_grouped_by_week %}
<h3>{{ week_schedules_group.grouper }}</h3>
<p>{{ week_schedules_group.list }}</p>
{% endfor %}
<br/>
<h3>All schedules regrouped</h3>
<p>{{ schedules_grouped_by_week }}</p>
结果:
Schedules by week
June 23, 2014 <------ SAME
[<Schedule: Kelian from Oxford schedule (1hs)>]
June 2, 2014
[<Schedule: [Bad Unicode data]>, <Schedule: [Bad Unicode data]>]
June 23, 2014 <------ SAME
[<Schedule: Rodrigo from Influester schedule (56hs)>]
June 9, 2014
[<Schedule: [Bad Unicode data]>]
All schedules regrouped
[{u'list': [<Schedule: Kelian from Oxford schedule (1hs)>], u'grouper': datetime.date(2014, 6, 23)}, <---SAME
{u'list': [<Schedule: [Bad Unicode data]>, <Schedule: [Bad Unicode data]>], u'grouper': datetime.date(2014, 6, 2)},
{u'list': [<Schedule: Rodrigo from Influester schedule (56hs)>], u'grouper': datetime.date(2014, 6, 23)}, <---SAME
{u'list': [<Schedule: [Bad Unicode data]>], u'grouper': datetime.date(2014, 6, 9)}]
注意:
糟糕的unicode是因为我的母语(西班牙语)的特殊字符。或者存在按datetime.date()对象重新分组的问题,或者存在围绕一些unicode/重新分组的问题(请注意,那些具有"坏unicode数据"的时间表被正确分组,现在不知道为什么)。我在论坛/堆栈溢出/谷歌组中发现很少有人有这个问题,但他们正在分组,但他们的模型有一个日期日期对象(日期= models. datetimefield()),所以每个有秒差的日期分别分组,他们通过按日期分组来解决问题。但这不是我的情况,正如您所看到的,我在整个代码中只处理datetime.date()对象。
我使用的是django 1.6.5和python 2.7.3
From the docs:
注意,
{% regroup %}
对其输入没有排序。
(在这个意义上,它就像uniq
或itertools.groupby
。)
如果你对get_schedules的结果排序,你应该得到正确的结果:
def get_schedules(self):
schedules = Schedule.objects.filter(week_date__range=[self.start_week, self.end_week])
schedules = schedules.order_by('week_date')
return schedules