python - 如何通过计算过滤查询集?
问题描述
我有一个类似的模型
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)
解决方案
此问题的解决方案可以分两步解决:
- 注释
abs(x - myPos.x) + abs(y - myPos.y)
表达式 - 比较带注释的表达式和
distance
值
为了注释表达式,Django ORM 支持提供数据库功能的func 表达式,如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)
推荐阅读
- docker - com.spotify.docker.client.shaded.org.apache.http.conn.HttpHostConnectException:连接到 127.0.0.1:8888 [/127.0.0.1] 失败:连接被拒绝
- python-3.x - Python 子进程模块无法正确运行脚本
- python-3.x - 如何根据条件对嵌套列表的元素求和?
- typescript - 如何在修饰函数中使用 Typescript 泛型
- scala - 如何使用数据时间格式化程序将 2020 年 7 月转换为 2020 年 7 月?
- python - 我试图制作一个启动两个 .exe 文件的应用程序,但我也想让它在任何计算机上运行,最好是一个大的 .exe 文件
- python - 从 total 中提取值 505 ,文件无法加载为 json 文件
- angular - 如何获取以角度传递给路由器链接的数据?
- javascript - 使用字符串字母顺序的jQuery排序数组
- python - 在抓取的 href 链接之前添加“https:”?