过滤查询集如何计算?

时间:2018-05-19 15:14:33

标签: python django django-queryset django-filter

我有一个类似于

的模型
class House:
    x = IntegerField()
    y = IntegerField()

我希望使用以下计算返回距离某个位置距离较小距离的房屋:

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 个答案:

答案 0 :(得分:3)

可以通过两个步骤解决此问题的解决方案:

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

    为了注释表达式Django ORM支持func expressions提供数据库功能,如 COALESCE LOWER SUM ,< strong> 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)