在django中按日期重组时出现的问题



我将尽可能详细地说明我遇到这个问题的背景。

模型:

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 %}对其输入没有排序。

(在这个意义上,它就像uniqitertools.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

最新更新