我需要建模一个可以有多行街道地址,城市,州(省)和邮政编码的邮政地址。这个国家被省略了。
我需要在街道地址中保留换行符,但仍然可以搜索地址。
我认为有两种方法可以做到:
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()
在代码可读性和效率(或它们的平衡)方面,最好的方法是什么?
答案 0 :(得分: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")
答案 1 :(得分:7)
我对您的地址数据有一些疑问:
大多数送货地址只有一行。许多人错误地将次要信息(单元号)放在第二个交付线上。这符合USPS标准(见USPS publication 28)。因此,我建议您使用CASS-Certified供应商验证您的地址数据,以便了解您正在处理的地址是真实的和标准化的。然后,您可能会更好地分析您的数据并决定如何存储它。我的猜测是,在对您的数据库执行地址验证后,您将不会有很多(如果有的话)地址,而且只有一条交付线。你必须在那时决定是否值得为它设一个单独的字段,或者将它保存在一个用换行符分隔的单个字段中。
完全披露:我是SmartyStreets的软件开发人员,这是一家地址验证公司和CASS认证的供应商。
答案 2 :(得分:4)
除非您的大多数地址都有多行街道部分(并且有很多行),否则我会选择后者,将它们全部存储在一个字段中,而不是打扰其他模型。如果您的大多数多行地址只有两行,请考虑在地址模型中创建street和street2字段(您可以为这两个“街道”字段选择更多描述性名称)。第一个存储第一个街道线,第二个字段存储所有其他线路(由换行符分隔)。我想在搜索地址时,你经常搜索包含街道号码的地址行,所以也许在你的程序逻辑中,你要确保街道号码行总是存储在第一个“街道”字段中,然后,您可以在数据库中添加索引。
另一方面,如果你的大多数地址都有多行街道部分,并且有两行以上,那么创建第二个模型是有意义的。
如果您事先并不知道,并且不介意将来可能“迁移”,请选择更简单的模型。否则,请选择双模型设计。