GeoDjango 在测试期间构建了错误的 SQL 查询

GeoDjango constructs faulty SQL query during testing

我的一个 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' 或等效项和 geomMultiPolygon

这仅在测试时发生

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'})

    ...

在测试环境之外以任何其他方式(浏览器、Postman、curl)调用此视图不会生成此错误。

注意:我对 Point 几何图形有类似的看法,它顺利通过了测试。

测试过程中有什么不同可能导致此问题?关于如何解决它的任何想法?我是 运行 Django 1.11.11、PostgreSQL 9.5.4 和 PostGIS 2.2.2

如果您尝试 print Field.objects.filter(geom__intersects=bbox_geom).query,您将看到提供给 ST_Intersects 的第一个参数是您的 Field.geom 字段。因此,数据库有一个Text定义field.geom

您的迁移有问题,忘记将 Field.geom 定义为 Geometry。使用 Django < 1.9 我会想到一个被遗忘的 objects = manager.GeoManager 模型定义 class,但自 Django 1.9 以来这是不必要的。