Да, мы можем сначала аннотировать набор запросов, а затем фильтровать аннотации. Поскольку django-2.2 мы можем использовать выражение Abs(..)
[Django-doc] :
from django.db.models import <b>F</b>
from django.db.models.functions import <b>Abs</b>
drivers = Driver.objects.annotate(
<b>abs_xy=Abs(F('x') - F('y'))</b>
).filter(abs_xy__gt=5)
Здесь мы, таким образом, фильтруем Driver
объекты, которые имеют | x-y |> 5 .
Мы также можем добавить несколько аннотаций, например:
from django.db.models import <b>F</b>
from django.db.models.functions import <b>Abs</b>
drivers = Driver.objects.annotate(
<b>abs_x10=Abs(F('x') - 10)</b>,
<b>abs_y5=Abs(F('y') - 5)</b>
).filter(abs_x10__gt=5, abs_y5__gt=5)
Это даст Driver
с при | x-10 |> 5 и | y-5 |> 5 .
Если версия Django ниже django-2.2 , вы можете реализовать это, как в Django-библиотеке [GitHub] :
from django.db.models.lookups import Transform
# ...
class Abs(Transform):
function = 'ABS'
lookup_name = 'abs'