Я хочу получить строку из таблицы postgis с заданной координатой / точкой. С raw sql я делаю это с:
SELECT * FROM parcelas
WHERE fk_area=152
AND ST_contains(geometry,ST_SetSRID(ST_Point(342884.86705619487, 6539464.45201204),32721));
Запрос до возвращает одну строку.
Когда я пытаюсь сделать это на django, он не возвращает мне ни одной строки :
from django.contrib.gis.geos import GEOSGeometry
class TestView(APIView):
def get(self, request, format=None):
pnt = GEOSGeometry('POINT(342884.86705619487 6539464.45201204)', srid=32721)
parcelas = Parcelas.objects.filter(fk_area=152,geometry__contains=pnt)
#Also tried this
#parcelas = Parcelas.objects.filter(fk_area=pk,geometry__contains='SRID=32721;POINT(342884.86705619487 6539464.45201204)')
serializer = ParcelasSerializer(parcelas, many=True)
return Response(serializer.data)
Даже с необработанным запросом django он не выполняется, хотя в этом случае он возвращает мне внутреннюю ошибку сервера (аргумент 3: класс 'TypeError': неправильный тип):
class TestView(APIView):
def get(self, request, format=None):
parcelas = Parcelas.objects.raw('SELECT * FROM parcelas WHERE fk_area=152 AND ST_contains(geometry,ST_SetSRID(ST_Point(342884.86705619487, 6539464.45201204),32721))')
for p in parcelas:
#Internal server error
print(p.id)
return Response('Test')
Моя модель посылки выглядит следующим образом:
from django.contrib.gis.db import models
class Parcelas(models.Model):
id = models.BigAutoField(primary_key=True)
fk_area = models.ForeignKey(Areas, models.DO_NOTHING, db_column='fk_area')
geometry = models.GeometryField()
class Meta:
managed = False
db_table = 'parcelas'
Я не знаю, что я делаю неправильно, если у кого-то есть идеи.
РЕДАКТИРОВАТЬ:
Если Я печатаю необработанный запрос, который django сделал:
SELECT "parcelas"."id", "parcelas"."fk_area", "parcelas"."geometry"::bytea FROM "parcelas" WHERE ("parcelas"."fk_area" = 152 AND ST_Contains("parcelas"."geometry", ST_Transform(ST_GeomFromEWKB('\001\001\000\000 \321\177\000\000C\224\335w\223\355\024A\350\303\355\0342\362XA'::bytea), 4326)))
Похоже, django не преобразовывает его в правильный srid (32721), но я не знаю, почему
EDIT 2:
Если в моей модели я указываю SRID, он работает правильно:
class Parcelas(models.Model):
geometry = models.GeometryField(srid=32721)
Проблема заключается в том, что SRID может быть переменным в зависимости от запроса, строки имеют один SRID или другой, поэтому Я не хочу, чтобы он всегда был единым целым.