有什么方法可以根据两列在 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)
是的,我们可以先对查询集进行注解,然后对注解进行过滤。自 django-2.2 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)
这将产生 Driver
s |x-10|>5 和 |y-5|>5 .
如果Django版本低于django-2.2, 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'
一开始,我的英语不是很好。我很抱歉。 我想根据两列的绝对值过滤我的结果。 我尝试了很多方法,但找不到任何有用的解决方案。
# 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)
是的,我们可以先对查询集进行注解,然后对注解进行过滤。自 django-2.2 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)
这将产生 Driver
s |x-10|>5 和 |y-5|>5 .
如果Django版本低于django-2.2, 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'