如何使用计算过滤查询集?

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)

这个问题的解决方案可以分两步解决:

  1. 注释abs(x - myPos.x) + abs(y - myPos.y)表达式
  2. 将带注释的表达式与 distance 值进行比较

为了注释表达式,Django ORM 支持 func expressions 提供数据库函数,如 COALESCELOWERSUMABS 等等。

对于您的示例,您可以使用此查询:

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)