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.

Другие вопросы по тегам