GeoDjango создает ошибочный SQL-запрос во время тестирования
Один из моих тестов GeoDjango не проходит с
ProgrammingError: function st_intersects(text, geometry) is not unique
LINE 1: ...NT(*) AS "__count" FROM "field" WHERE ST_Interse...```
Я не могу понять, почему он звонит st_intersects(text, geometry)
вместо st_intersects(geometry, geometry)
видя, что это определяется как
from django.contrib.gis.geos import Polygon
...
bbox_geom = Polygon.from_bbox(bbox.split(','))
return Field.objects.filter(geom__intersects=bbox_geom)
на мой взгляд, где bbox = '1,1,2,2'
или эквивалентный и geom
это MultiPolygon
,
Это происходит только при тестировании как
from django.test import TestCase, Client
def setUp(self):
self.client = Client()
def test_bbox_filter_single_feature(self):
response = self.client.get('/api/v1/fields/', {'bbox': '1,1,2,2'})
...
Вызов этого представления любым другим способом (браузер, почтальон, curl
) вне среды тестирования не генерирует эту ошибку.
Примечание: у меня похожий вид для Point
геометрия, которая проходит тест без заминки.
Что отличается во время тестирования, что может вызвать эту проблему? Есть мысли о том, как это исправить? Я использую Django 1.11.11, PostgreSQL 9.5.4 и PostGIS 2.2.2
1 ответ
Если вы попытаетесь print Field.objects.filter(geom__intersects=bbox_geom).query
, вы увидите, что первый аргумент, предоставленный ST_Intersects
твой Field.geom
поле. Таким образом, база данных имеет Text
значение field.geom
,
Что-то не так с вашими миграциями, которые забывают определить Field.geom
как геометрия. С Джанго < 1,9 я бы подумал о забытом objects = manager.GeoManager
определение у вас модельного класса, но в этом нет необходимости, поскольку Django 1.9.