我在Django中有这个查询集:
obj = Obj.objects.annotate(duration = F('date_end') - F('date_start')).order_by('duration')
以下工作完美:
obj[0].duration
obj.aggregate(Sum('duration'))['duration__sum']
但是,在这种情况下,过滤不起作用,即使文档说它应该:
obj = obj.filter( duration__gte = <a_class_datetime.timedelta> ) # doesn't work
obj = obj.filter( duration = 1 ) # doesn't work
这是我得到的错误:
类型错误:预期的字符串或类似字节的对象
我绕过这个问题的方法是遍历数据集 - 这是巨大的。关于为什么这不起作用的任何提示?
你需要在过滤时使用Python 的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))