0

我正在尝试使用 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 视图/表单以根据特定位置过滤结果?提前致谢。

4

1 回答 1

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 支持空间数据。

于 2013-07-01T16:36:44.717 回答