我正在开发一个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, ...],
],
}
答案 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