Django计算按年/月分组,没有额外的

Ang*_*rto 6 python django aggregate annotate

我正在使用django 1.9

型号:

class Comment(models.Model):
    title = models.CharField(max_length=250, null=False)
    date = models.DateField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

由于'extra()'将在django中弃用,我试图弄清楚如何在不使用'额外'的情况下按年份计算评论组

这是带额外的代码:

Comment.objects.extra(select={'year': "EXTRACT(year FROM date)",
    'month': "EXTRACT(month from date)"})\
    .values('year', 'month').annotate(Count('pk'))
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

Nik*_*ita 6

在文档中查看年份和月份,可能会像下面这样的工作:

Comment.objects.annotate(year=Q(date__year), 
                         month=Q(date__month)
                         ).values('year', 'month').annotate(Count('pk'))
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,那么您可以定义表示函数的自定义Func()表达式而不是Q(date__year),EXTRACT(year FROM date)并使用它annotate().或者,作为最后的手段,还有RawSQL().

使用Func(),像这样:

from django.db.models import Func

class Extract(Func):
    """
    Performs extraction of `what_to_extract` from `*expressions`.

    Arguments:
        *expressions (string): Only single value is supported, should be field name to
                               extract from.
        what_to_extract (string): Extraction specificator.

    Returns:
        class: Func() expression class, representing 'EXTRACT(`what_to_extract` FROM `*expressions`)'.
    """

    function = 'EXTRACT'
    template = '%(function)s(%(what_to_extract)s FROM %(expressions)s)'


#Usage
Comment.objects.annotate(year=Extract(date, what_to_extract='year'), 
                             month=Extract(date, what_to_extract='month')
                             ).values('year', 'month').annotate(Count('pk'))
Run Code Online (Sandbox Code Playgroud)