2011-10-08 78 views
16

我需要建立一個可以有多行街道地址,城市,州(省)和郵政編碼的郵政地址。該國被省略。如何模擬郵政地址

我需要在街道地址中保留換行符,但仍然能夠搜索地址。

我看到兩種方法可以做到這一點:

 
class Address(models.Model): 
    street = models.ForeignKey('StreetAddress') 
    city = models.TextField() 
    province = models.TextField() 
    code = models.TextField()
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() 
是什麼做的最好方式代碼可讀性和效率(或其平衡)的條款?

回答

3

除非大多數地址有多行街道部分(並且有多條線路),否則我會選擇後者,將其全部存儲在單個字段中,而不用擔心其他模型。如果大多數多行地址只有兩行,請考慮在地址模型中創建街道和街道2字段(您可以爲這兩個「街道」字段選擇更多描述性名稱)。第一個將存儲第一條街道,第二個場將存儲所有附加線(以換行符分隔)。我想在搜索地址時,最常搜索包含街道號碼的地址行,因此可能在您的程序邏輯中確保街道號碼行始終存儲在第一個「街道」字段中,你可以在你的數據庫中添加一個索引。另一方面,如果你的大多數地址都有多行的街道部分,並且有兩行以上的行,那麼創建第二個模型是有意義的。

如果您事先不知道,也不介意將來有可能「遷移」,請選擇更簡單的模型。否則,去你的雙模式設計。

11

以下是我如何模擬美國地址的方法。如果需要,您還可以存儲10位數的郵政編碼(XXXXX-XXXX)。

您也可以考慮從geodjango添加一個點字段或poly字段,具體取決於您使用的地址。

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") 
+4

由於Django 1.4,localflavor不再與Django捆綁在一起。所以要使用這個代碼,應該手動安裝它:'pip install django_localflavor_us'並導入USStateField,如下所示:'from django_localflavor_us.models import USStateField'。 – Altaisoft

+0

我們如何建模一般地址而不僅僅是美國地址? –

+1

@Altaisoft提供的建議已過時。從該pypi頁面: 「警告:已過時的軟件包您不應再使用此軟件包,前者的django.contrib.localflavor軟件包現在可用作https://pypi.python.org/pypi/django-localflavor軟件包,包括美國當地的美味。「 所以相當於'pip install django-localflavor'&localflavor.models import USStateField' –

7

我有你的地址數據的一些問題:

  1. 已被驗證到交貨點的數據?
  2. 如果是這樣,你是否有很高的百分比,仍然有多個交付線(街道場)?

大多數送貨地址只有一行。許多人錯誤地將次要信息(單元號碼)放在第二條輸送線上。這違反了USPS標準(參見USPS publication 28)。因此,我建議您使用CASS-Certified供應商驗證您的地址數據,以便您知道您所處理的地址是真實且標準化的。那麼你可能會更好地分析你的數據並決定如何存儲它。我的猜測是,在對您的數據庫進行地址驗證後,您將不會有多個(如果有)地址與多個單獨的交付行。您必須決定是否值得爲其分配一個字段,或者將其保留在用換行符分隔的單個字段中。

完全披露:我是SmartyStreets,地址驗證公司和CASS認證的供應商的軟件開發商。