Skip to main content
 首页 » 编程设计

python之Haystack 可以通过 geodjango PointField 进行过滤吗

2024年08月30日37jirigala

我希望能够使用 django-haystack 对模型进行全文搜索。该模型使用 PointField 来存储坐标。我想根据与某个点的距离过滤搜索结果。 Haystack 有可能吗?有更好的方法吗?

from django.contrib.gis.db import models 
 
 
class Listing(models.Model): 
    name = models.CharField(max_length=255) 
    description = models.TextField() 
    location = models.PointField() 

请您参考如下方法:

听起来您希望用户在文本搜索中输入地理信息,例如地址或邮政编码。我就是这样做的,尽管我不确定它是如何扩展的。我刚刚在 5 分钟前完成了这个。

You should create a custom search form从 SearchForm 或其他选项之一(对我来说是 FacetedSearchForm)进行子类化。覆盖搜索方法。

首先将搜索字符串变成一个点。 http://code.google.com/p/geopy/wiki/GettingStarted

class MainSearchForm(FacetedSearchForm): 
 
    def search(self): 
 
        query = self.cleaned_data['q'] 
        g = geocoders.Google() 
        place, (lat, lng) = g.geocode('%s' % query) 
        pnt = fromstr('POINT(%s %s)' % (lng, lat), srid=4326) 

然后取搜索查询集,我用了RelatedSearchQuerySet因为它允许您使用 load_all_queryset() 这是我按距离过滤的地方。 GeoDjango 用 GeoDjango Distance Queries 来拯救.通过距离查询,您可以选择如何使用小于、大于等距离以及距离本身,以您想要的任何单位进行过滤。

        sqs = RelatedSearchQuerySet().load_all() 
        sqs = sqs.load_all_queryset(Listing,  
                                    Listing.objects.filter(location__distance_lte=(pnt, D(mi=20)))) 
        return sqs 

这应该是一个坚实的开始。希望这能为您指明正确的方向。