【问题标题】:how to model a postal address如何为邮政地址建模
【发布时间】:2011-10-08 23:44:05
【问题描述】:

我需要为一个邮政地址建模,该地址可以包含多行街道地址、城市、州(省)和邮政编码。国家被省略了。

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

我看到了两种方法:

class Address(models.Model):
    street = models.ForeignKey('StreetAddress')
    city = models.TextField()
    province = models.TextField()
    code = models.TextField()<br>
class StreetAddress(models.Model):
    line_number = models.IntegerField()
    text = models.TextField()

或将街道地址存储在单个文本字段中但使用特殊分隔符对换行符进行编码的这个:

class Address(models.Model):
    street = models.TextField()
    city = models.TextField()
    province = models.TextField()
    code = models.TextField()

就代码可读性和效率(或它们的平衡)而言,最好的方法是什么?

【问题讨论】:

    标签: django geocoding


    【解决方案1】:

    以下是我为美国地址建模的方法。如果需要,您还可以存储 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")
    

    【讨论】:

    • 从 Django 1.4 开始,localflavor 不再与 Django 捆绑在一起。因此,要使用此代码,应手动安装:pip install django_localflavor_us 并按如下方式导入 USStateField:from django_localflavor_us.models import USStateField
    • 我们如何为任何地址建模,而不仅仅是美国地址?
    • @Altaisoft 提供的建议已过时。从那个 pypi 页面:“警告:过时的包你不应该再使用这个包。以前的 django.contrib.localflavor 包现在可以作为 pypi.python.org/pypi/django-localflavor 包使用,包括美国本地风味。”所以现在相当于pip install django-localflavor & from localflavor.models import USStateField
    【解决方案2】:

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

    1. 数据是否已经验证到交付点?
    2. 如果是这样,您是否仍有高比例的配送线(街道)?

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        查看django-address

        它提供了一个模型字段,您可以在其中执行以下操作

        from address.models import AddressField
        
        class SuperAwesomeCustomer(models.Model):
            address = AddressField()
        

        【讨论】:

          猜你喜欢
          • 2016-07-07
          • 2014-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多