Django - 将城市、州和邮政编码合并为单一字段

3 投票
2 回答
1463 浏览
提问于 2025-04-17 11:02

有没有人成功做到这一点?

我想做一个功能,类似于在 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 上有一个副本,地址是:

https://github.com/amites/django-general

2 个回答

2

最近我遇到了一个类似的问题,我使用了谷歌的地理编码API来解决。这个方法很不错,因为你根本不需要自己去解析地址字符串。你只需要把地址传给谷歌,它会帮你处理解析的工作。如果找到了位置,它会返回一个结构化的对象,里面描述了这个地址。你可以提取你想要的任何地址信息。

当然,这个方法只有在你有自己的网站,并且使用地理位置API符合谷歌地图的服务条款时才能使用。

1

对于这种高级功能,最好使用一些专门的工具,比如Solr搜索引擎

如果你还不太了解它,Solr是一个基于Java的开源搜索引擎,非常强大,可以添加位置搜索的功能。搜索操作是通过网络服务来完成的(比如xml、json等格式)。

基本步骤是这样的:你需要在服务器上安装Solr,配置一个模式(就是存储和索引数据的方式),从你的数据库中导入数据,然后把你的搜索表单和网络服务连接起来。

你可能还想看看这篇文章,了解更多关于地理位置搜索的信息(可能有点过时,你需要自己确认一下)。

撰写回答