首页 > 解决方案 > 如何通过计算过滤查询集?

问题描述

我有一个类似的模型

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)

标签: pythondjangodjango-querysetdjango-filter

解决方案


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

  1. 注释abs(x - myPos.x) + abs(y - myPos.y)表达式
  2. 比较带注释的表达式和distance

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

推荐阅读