Django - 将城市、州和邮政编码合并为单一字段
有没有人成功做到这一点?
我想做一个功能,类似于在 http://www.walmart.com/cservice/ca_storefinder.gsp 上的那种。
用户可以输入城市、州或者邮政编码,然后系统能智能地查找相关信息。
我开始尝试用一些正则表达式和分割字段的方法,但很快意识到,这个任务需要更多的思考,才能让最终用户使用起来更智能。
考虑过的方案有:
- 实时的 AJAX 自动补全调用
- Sphinx 全文搜索
- 数据库端的正则搜索
- 正则表达式验证用户输入
到目前为止的代码片段如下:
import re
from general.models import ZipCode
def findLocation(value):
match = re.search(r"\d{5}", value)
if match:
try:
return Zipcode.objects.get(zip=value)
except ZipCode.DoesNotExist:
return False
else:
kwargs = {}
vals = value.split(',')
if len(vals) > 1:
kwargs['city'] = value[:len(value)-len(vals[-1])-1]
state = vals[-1].strip()
if len(state) == 2:
kwargs['state'] = state
else:
kwargs['state_name'] = state
else:
kwargs['city'] = value
return ZipCode.objects.filter(**kwargs)
在这个例子中,ZipCode 是一个数据库模型,包含了所有美国的邮政编码、州、州的缩写和城市。这个模型在 GitHub 上有一个副本,地址是:
2 个回答
1
对于这种高级功能,最好使用一些专门的工具,比如Solr搜索引擎。
如果你还不太了解它,Solr是一个基于Java的开源搜索引擎,非常强大,可以添加位置搜索的功能。搜索操作是通过网络服务来完成的(比如xml、json等格式)。
基本步骤是这样的:你需要在服务器上安装Solr,配置一个模式(就是存储和索引数据的方式),从你的数据库中导入数据,然后把你的搜索表单和网络服务连接起来。
你可能还想看看这篇文章,了解更多关于地理位置搜索的信息(可能有点过时,你需要自己确认一下)。