Как фильтровать долготу/широту в Django PointField напрямую?

Я хочу фильтровать непосредственно по значению lat/lng в поле 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.

Буду благодарен за любую помощь.

You can work with the ST_X [postgis.net] and ST_Y [postgis. net] functions that are provided by the database, these however are not implemented directly in Django as far as I know, but that is not a problem: we can define these ourselves.

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)
Вернуться на верх