我的一个GeoDjango测试失败并带有
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
)调用此视图不会产生此错误。
注意:对于{{1}}几何体,我有一个类似的视图,它可以毫不费力地通过测试。
测试期间可能导致此问题的不同之处是什么?有关如何解决它的任何想法?我正在运行Django 1.11.11,PostgreSQL 9.5.4和PostGIS 2.2.2
答案 0 :(得分:1)
如果您尝试print Field.objects.filter(geom__intersects=bbox_geom).query
,您会看到提供给ST_Intersects
的第一个参数是您的Field.geom
字段。因此,数据库的Text
定义为field.geom
。
您的迁移存在问题,忘记将Field.geom
定义为几何。使用 Django< 1.9 我会想到你的Model类上有一个被遗忘的objects = manager.GeoManager
定义,但是自Django 1.9以来这是不必要的。