Django查询集日期:将月份聚合并格式化为名称字符串

时间:2010-11-01 22:27:27

标签: django formatting aggregate-functions

我有一个简单的博客应用程序,我正在移植到Django。我遇到的一个绊脚石是按月汇总文章条目,并将其显示为列表。 db中的每篇文章都有一个简单的日期时间字段。 HTML输出应该是这样的:

2010

  • 1月(3个条目)
  • 二月(2个条目)
  • 三月(3个条目)

我目前正在模板中使用{%foreach%}块来循环查询返回的所有月份。

使用日期('datestamp','month')似乎是正确的方向,但是如何在结果中获得文章计数,以及如何将月份整数格式化为模板中的名称字符串?< / p>

1 个答案:

答案 0 :(得分:0)

您可以使用django-cube。在views.py中使用以下代码(然后在网址中连接entry_count),您应该得到所需内容:

# cube declaration
from cube.models import Cube, Dimension

class EntryCube(Cube):

    #replace <your_date_field> by the field name
    month = Dimension('<your_date_field>__month') 
    year = Dimension('<your_date_field>__year')

    @staticmethod
    def aggregation(queryset):
        return queryset.count()

# views declaration
from .models import <YourModel> #replace by your model
from cube.views import table_from_cube

def entry_count(request):
    cube = EntryCube(<YourModel>.objects.all())
    return table_from_cube(request, cube, ['year', 'month'], template='table.html')
    #template 'table.html' is in 'example/template' folder, copy it in your template folder, and modify it to your wish.

编辑:

如果您想自定义尺寸的显示方式,您可以将Dimension作为子类(请参阅此snippet):

class MonthDimension(Dimension):

    @property
    def pretty_constraint(self):
        #just return the month name according to the month number that you can get in "self.constraint", e.g. self.constraint = 1 -> return 'january'
        return month_name

(我计划提供维度的子类,以允许不同的格式,如你所需。所以如果你使用django-cube,并编写一个好的Dimension子类来格式化日期,我很乐意接受看看吧!)


好的......对你想要的东西来说太过分了。但是,如果您之后决定需要更多关于条目的统计信息(例如条目数/作者/月/年/标签等等),则只需向多维数据集添加维度即可。如果您决定使用它,并需要更多帮助,请询问!