2012-01-09 39 views
2

我有两个模型,一个有区域,一个有点。我试图在保存点模型时进行一些简单的查找(将消息发送给出现在该区域的用户)。GeoDjango的内部和包含查询集过滤器不同于直接GEOS查找

以下代码来自post_save信号处理程序。

(Pdb) PointBasedModel.objects.filter(location=instance.location) 
[<PointBasedModel: on 2011-12-03 16:05:52>, <PointBasedModel: on 2011-12-03 16:05:52>] 

(Pdb) PointBasedModel.objects.filter(location__within=PolyBasedModel.objects.all()[0].area) 
[<PointBasedModel: on 2012-01-03 17:36:51>, <PointBasedModel: on 2011-12-03 16:05:52>, <PointBasedModel: on 2011-12-03 16:05:52>, <PointBasedModel: on 2011-11-09 19:53:34>, <PointBasedModel: on 2011-11-09 19:53:34>, <PointBasedModel: on 2011-11-06 15:24:31>, <PointBasedModel: on 2011-10-17 07:40:39>, <PointBasedModel: on 2011-02-27 20:46:04>] 

(Pdb) PolyBasedModel.objects.filter(area__contains=PointBasedModel.objects.filter(location__within=PolyBasedModel.objects.all()[0].area)[0].location) 
[] 

正如你所看到的,它可以检索我刚才创建的实例,然后找到所有在出现PointBasedModel实例PolyBasedModels,过滤PolyBasedModel背部使用被称为是内PointBasedModel保利,失败。

的代码是有点做作来演示该问题,但简单地说,这是我所看到的:

(pdb) PolyBasedModel.objects.filter(area__contains=instance.location) 
[] 
(pdb) instance.location.within(PolyBasedModel.objects.get(pk=2).area) 
True 
(Pdb) PolyBasedModel.objects.get(pk=2).area.contains(instance.location) 
True 

这是没有意义......任何人都遇到过类似问题/知道解决办法?

回答

0

随着一点点的挖多,我发现了这个问题:

(Pdb) str(PolyBasedModel.objects.filter(area__contains='POINT (-2.6203333333300001 51.4453333332999989)').query) 
*** AttributeError: 'str' object has no attribute 'ewkb' 

'str' object has no attribute 'ewkb'快速搜索发现http://groups.google.com/group/geodjango/browse_thread/thread/11a3016a0aeceec9其中指出,你必须要使用的GeoManager ...明显。

更改PolyBasedModel以使用GeoManager修复它。

我想这就是你从非地理空间到地理空间的转换!第一次做对。 :-)