为什么这个 Django 通过"注释"变量过滤不起作用?



我在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))

相关内容

  • 没有找到相关文章

最新更新