我正在尝试使用Django(1.5.1)和Haystack(2.0.1)来搜索包含地理位置信息的对象:
from django.contrib.gis.db import models as geomodels
class GeoModel(geomodels.Model):
geo_point = geomodels.PointField()
# Geographic Locator manager
objects = geomodels.GeoManager()
...
我需要根据地理位置进行过滤。以下查询有效,主要是因为GeoModel
正在使用geomodels.GeoManager
:
from django.contrib.gis.measure import D
from django.contrib.gis.geos import Point
...
center = Point(lat, lng)
radius = D(km=100)
GeoModel.objects.all().filter(geo_point__distance_lte=(center, radius))
问题是当我尝试使用Haystack根据其地理位置过滤结果时。我创建了SearchView的子类:
from haystack.views import SearchView
...
class MySearchView(SearchView):
def get_results(self):
center = Point(lat, lng)
radius = D(km=100)
results = super(MySearchView, self).get_results() # << OK, get all results
return results.filter(geo_point__distance_lte=(center, radius)) # << WRONG, no results
那么,我如何自定义Haystack视图/表单以根据特定位置过滤结果? 提前谢谢。
答案 0 :(得分:1)
我正在使用一个非常相似的设置(Django 1.5.4,Haystack 2.0.0,Elasticsearch 0.90.0),这就是我所拥有的:
from haystack.utils.geo import D, Point
from haystack.views import SearchView
class MySearchView(SearchView):
results = super(MySearchView, self).get_results()
...
lng = -112.0739
lat = 33.4492
center = Point(lng, lat)
radius = D(mi=50)
results = results.dwithin('geo_point', center, radius)
...
return results
要记住的重要一点是后端。根据Haystack后端支持矩阵(http://django-haystack.readthedocs.org/en/latest/backend_support.html#backend-support-matrix),只有Solr和Elasticsearch支持空间数据。