如何建模邮政地址

ako*_*nsu 23 django geocoding

我需要建模一个可以有多行街道地址,城市,州(省)和邮政编码的邮政地址.这个国家被省略了.

我需要在街道地址中保留换行符,但仍然可以搜索地址.

我认为有两种方法可以做到: __CODE__Run Code Online (Sandbox Code Playgroud) 或者这个将街道地址存储在一个文本字段中,但使用特殊的分隔符来编码换行符: __CODE__ 在代码可读性和效率(或它们的平衡)方面,最好的方法是什么?

Iss*_*lly 11

以下是我为美国建模地址的方法.如果需要,您还可以存储10位数的邮政编码(XXXXX-XXXX).

您还可以考虑从geodjango添加点域或多边形字段,具体取决于您使用的地址.

from django.contrib.gis.db import models
from django.utils.translation import ugettext as _
from django.contrib.localflavor.us.models import USStateField

class UsLocation(models.Model):
    address_1 = models.CharField(_("address"), max_length=128)
    address_2 = models.CharField(_("address cont'd"), max_length=128, blank=True)

    city = models.CharField(_("city"), max_length=64, default="Zanesville")
    state = USStateField(_("state"), default="OH")
    zip_code = models.CharField(_("zip code"), max_length=5, default="43701")
Run Code Online (Sandbox Code Playgroud)

  • 自Django 1.4以来,localflavor不再与Django捆绑在一起.因此,要使用此代码,应手动安装:`pip install django_localflavor_us`并导入USStateField,如下所示:`from django_localflavor_us.models import USStateField`. (5认同)
  • @Altaisoft给出的建议已经过时了.从那个pypi页面:"警告:过时的包你不应该再使用这个包.以前的django.contrib.localflavor包现在可用作https://pypi.python.org/pypi/django-localflavor包,包括美国的地方风味." 所以相当于现在`pip install django-localflavor`&`from localflavor.models import USStateField` (3认同)

mdw*_*ott 7

我对您的地址数据有一些疑问:

  1. 数据是否已经过验证到交货点?
  2. 如果是这样,您是否仍有多个交付线(街道场)?

大多数送货地址只有一行.许多人错误地将次要信息(单元号)放在第二个交付线上.这符合USPS标准(参见USPS出版物28).因此,我建议您使用CASS认证的供应商验证您的地址数据,以便您知道您正在处理的地址是真实的和标准化的.然后,您可能会更好地分析您的数据并决定如何存储它.我的猜测是,在您的数据库上执行地址验证后,您将不会有很多(如果有的话)地址,而且只有一条交付线.你必须在那时决定是否值得拥有一个单独的字段,或者将它保存在一个用换行符分隔的单个字段中.

完全披露:我是SmartyStreets的软件开发人员,SmartyStreets是一家地址验证公司和CASS认证的供应商.


imm*_*imm 5

除非您的大多数地址都有多行街道部分(并且有很多行),否则我会选择后者,将其全部存储在一个字段中,并且不打扰额外的模型。如果您的大多数多行地址只有两行,请考虑在您的地址模型中创建一个 street 和 street2 字段(您可以为这两个“街道”字段选择更具描述性的名称)。第一个字段将存储第一条街道线,第二个字段将存储所有其他行(由换行符分隔)。我认为在搜索地址时,您最常在包含街道号码的地址行上进行搜索,因此也许在您的程序逻辑中,您会确保街道号码行始终存储在第一个“街道”字段中,即然后,您可以在数据库中添加索引。

另一方面,如果您的大多数地址都有多行街道部分,并且有两条以上的行,那么创建第二个模型是有意义的。

如果您事先不知道,并且不介意将来可能“迁移”,请选择更简单的模型。否则,请选择您的双模型设计。