Как фильтровать долготу/широту в 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)