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'
或等效项和 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'})
...
在测试环境之外以任何其他方式(浏览器、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 以来这是不必要的。
我的一个 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'})
...
在测试环境之外以任何其他方式(浏览器、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 以来这是不必要的。