为什么Django的'annotate'变量过滤器不起作用?

时间:2019-10-10 01:18:51

标签: django annotations django-queryset

我在Django中有这个查询集:

Select * from
(Select nombre, codigo, estado
From your_table)
Pivot
(Max(estado) for codigo in ('ES', 'IT');

以下内容可以正常工作:

obj = Obj.objects.annotate(duration = F('date_end') - F('date_start')).order_by('duration')

但是,即使文档说应该进行过滤,在这种情况下过滤也不起作用

obj[0].duration

obj.aggregate(Sum('duration'))['duration__sum']

这是我得到的错误:

  

TypeError:预期的字符串或类似字节的对象

我绕过此问题的方法是遍历数据集-这是巨大的。为什么这不起作用的任何提示?

1 个答案:

答案 0 :(得分:1)

您需要在过滤时使用Python's timedelta实例,

from datetime import timedelta

obj = obj.filter(duration__gte=timedelta(days=10))

除此之外,使用ExpressionWrapper指定 output_field ,以便避免不必要的错误。

from django.db import models

# for annotation
annotated_queryset = Foo.objects.annotate(
    duration=models.ExpressionWrapper(models.F('date_end') - models.F('date_start'),
                                      output_field=models.DurationField()))

# for filtering
from datetime import timedelta

filtered_queryset = annotated_queryset.filter(duration__gte=timedelta(days=10))