如何使用计算过滤查询集?
How filter queryset with a calculation?
我有一个类似于
的模型
class House:
x = IntegerField()
y = IntegerField()
我想return距离距离较近的房屋,使用以下计算:
abs(house.x - myPos.x) + abs(house.y - myPos.y) < distance
但我不知道如何制作该过滤器,因为 filter() 仅与模型的字段进行比较。我想做类似的事情:
House.objects.filter(abs(x - myPos.x) + abs(y - myPos.y) < distance)
这个问题的解决方案可以分两步解决:
- 注释
abs(x - myPos.x) + abs(y - myPos.y)
表达式
- 将带注释的表达式与
distance
值进行比较
为了注释表达式,Django ORM 支持 func expressions 提供数据库函数,如 COALESCE、LOWER、SUM、ABS 等等。
对于您的示例,您可以使用此查询:
from django.db.models import Func, F
House.objects.annotate(abs_calculation=Func(F('x') - myPos.x, function='ABS') + Func(F('y') - myPos.y, function='ABS')).filter(abs_calculation__lt=distance)
我有一个类似于
的模型class House:
x = IntegerField()
y = IntegerField()
我想return距离距离较近的房屋,使用以下计算:
abs(house.x - myPos.x) + abs(house.y - myPos.y) < distance
但我不知道如何制作该过滤器,因为 filter() 仅与模型的字段进行比较。我想做类似的事情:
House.objects.filter(abs(x - myPos.x) + abs(y - myPos.y) < distance)
这个问题的解决方案可以分两步解决:
- 注释
abs(x - myPos.x) + abs(y - myPos.y)
表达式 - 将带注释的表达式与
distance
值进行比较
为了注释表达式,Django ORM 支持 func expressions 提供数据库函数,如 COALESCE、LOWER、SUM、ABS 等等。
对于您的示例,您可以使用此查询:
from django.db.models import Func, F
House.objects.annotate(abs_calculation=Func(F('x') - myPos.x, function='ABS') + Func(F('y') - myPos.y, function='ABS')).filter(abs_calculation__lt=distance)