如何在django python>中按周开始/结束(期间)日期对评论进行分组?

时间:2016-10-31 19:47:42

标签: python django

我正在开发一个django python中的web应用程序,它显示了对特定项目所做的所有评论的列表。我想要的是按日期对评论进行分组,以便我可以在模板中按周开始/结束列出它们,类似于下面示例中的内容。任何帮助肯定会受到赞赏!

示例:

    Dataset = 
   {
      [
        period: '10/03/2016 - 10/07/2016', 
        comments: [ comments.object, comments.object, ...]
      ],
      [ 
        period: '10/10/2016 - 10/14/2016', 
        comments: [ comments.object, comments.object, ...],
      ],
   }

1 个答案:

答案 0 :(得分:0)

有三种可能的方法。

圣杯将是找到一个花哨的表达,在注释中实现这一点:

comments = Comment.objects.annotate(week_start_date=SomeFancyExpression('date')).order_by('week_start_date')

如果没有多少思考,我不能做到这一点。我甚至不确定它是否可能。

其次,如果您认为自己会有大量或昂贵的查询,则可能希望在保存方法中对week_start_date属性进行非规范化。

第三,在您的视图代码中完成所有操作。这是实现这一目标的一种相当粗略的方式:

import datetime
from django.db.models import Min, Max

comments = Comment.objects.aggregate(Min('date'), Max('date'))
min_week_start = comments['date__min'] - datetime.timedelta(comments['date__min'].weekday())
max_week_start = comments['date__max'] - datetime.timedelta(comments['date__max'].weekday())
num_weeks = (max_week_start - min_week_start).days // 7

# this may be off by one
weeks = (min_week_start + datetime.timedelta(days=7 * x) for x in range(0, num_weeks + 1))

grouped_comments = []
for week_start_date in weeks:
    grouped_comments.append(
        week_start_date,
        Comment.objects.filter(
            date__gte=week_start_date,
            date__lt=week_start_date + datetime.timedelta(days=7)
        )
    )

这是一个查询开始时的最大值和最小值,此后每周一个查询。如果你能找到一种让方法一个工作的方法,那就是一个完整的单一查询。

(注意我已经使用'未来'分区计算num_weeks。如果你在python 2上,在顶部添加from __future__ import division