有什么方法可以根据两列在 Django 中过滤查询集吗?例如 |x-10| > 5 和 |y-5| > 5

Is there any way for filter a queryset in django based on two columns? for example |x-10| > 5 and |y-5| > 5

一开始,我的英语不是很好。我很抱歉。 我想根据两列的绝对值过滤我的结果。 我尝试了很多方法,但找不到任何有用的解决方案。

# This is my model
class Driver(models.Model):
    account = GenericRelation(Account, related_query_name='drivers')
    rating = models.FloatField()
    x = models.FloatField()
    y = models.FloatField()
    active = models.BooleanField(default=False)

# I want filter something like this But :(
drivers = Driver.objects.filter(abs(Driver.y - 5) > 5 and abs(Driver.x - 10) > 5)

是的,我们可以先对查询集进行注解,然后对注解进行过滤。自 we can use the Abs(..) expression [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)

因此,我们在这里过滤具有 |x-y|>5.

Driver 个对象

我们还可以添加多个注释,例如:

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)

这将产生 Drivers |x-10|>5|y-5|>5 .

如果Django版本低于, you can implement this, like in the Django-library [GitHub]:

from django.db.models.lookups import Transform

# ...

class Abs(Transform):
    function = 'ABS'
    lookup_name = 'abs'