如何直接在 Django PointField 上过滤经度/纬度?

问题描述 投票:0回答:1

我想直接过滤 GeoDjango PointField 上的纬度/经度值。

例如

geolocation__lat__lte=40.0

通常在 django 中,我可以像

geolocation.x
geolocation.y
一样直接访问纬度/经度,所以我尝试像
geolocation_y__lte=40.0
那样进行过滤。

结果就是

FieldError: Unsupported lookup 'y' for PointField or join on the field not permitted.

ChatGPT 无法提供帮助,而且我在 stackoverflow 上没有找到相关问题。

将感谢任何帮助。

django django-queryset geodjango
1个回答
0
投票

您可以使用数据库提供的

ST_X
 [postgis.net]
ST_Y
 [postgis.net]
函数,但是这些函数并不是直接在据我所知,Django,但这不是问题:我们可以自己定义这些。

from django.db.models import FloatField
from django.db.models.expressions import Func


class ST_X(Func):
    function = 'ST_X'
    output_field = FloatField()


class ST_Y(Func):
    function = 'ST_Y'
    output_field = FloatField()

然后使用:

MyModel.objects.alias(
    geolocation_lat=ST_Y('geolocation'), geolocation_long=ST_X('geolocation')
).filter(geolocation_lat__lte=40.0)
© www.soinside.com 2019 - 2024. All rights reserved.