как смоделировать почтовый адрес - PullRequest
23 голосов
/ 09 октября 2011

Мне нужно смоделировать почтовый адрес, который может содержать многострочный адрес, город, штат (провинцию) и почтовый индекс.страна не указана.

Мне нужно сохранить разрывы строк в адресах улиц, но я все равно могу искать адреса.

Я вижу два способа сделать это:

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()

что является лучшим способом сделать это с точки зрения читабельности и эффективности кода(или их баланс)?

Ответы [ 3 ]

11 голосов
/ 09 октября 2011

Вот как я моделирую адреса для США. Вы также можете сохранить 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")
7 голосов
/ 17 января 2012

У меня есть несколько вопросов о ваших адресах:

  1. Проверены ли данные уже до пункта доставки?
  2. Если да, то есть ли у вас высокий процент, который все еще имеет более одной строки доставки (поле улицы)?

Большинство адресов доставки имеют только одну строку. Многие люди ошибочно размещают вторичную информацию (номер единицы) на второй линии доставки. Это противоречит стандартам USPS (см. публикация USPS 28 ). Поэтому я рекомендую вам проверить свои адреса с помощью CASS-Certified продавца, чтобы вы знали, что адреса, с которыми вы имеете дело, являются реальными и стандартизированными. Тогда вы, вероятно, сможете лучше проанализировать свои данные и принять решение о том, как их хранить. Я предполагаю, что после проверки адреса в вашей базе данных у вас не будет очень много (если есть) адресов с более чем одной линией доставки. В этот момент вам нужно будет решить, стоит ли иметь для него отдельное поле или оставить его в одном поле, ограниченном переносом строки.

Полное раскрытие: я разработчик программного обеспечения для SmartyStreets , компании по проверке адресов и CASS-Certified Vender.

4 голосов
/ 09 октября 2011

Если у большинства ваших адресов нет многострочных улиц (и много строк), я бы выбрал последнее, сохраняя все это в одном поле и не заботясь о дополнительной модели. Если большинство ваших многострочных адресов состоят только из двух строк, рассмотрите возможность создания поля street и street2 в вашей модели Address (вы можете выбрать более описательные имена для этих двух полей "street"). Первый будет хранить первую строку улицы, а второе поле будет хранить все дополнительные линии (разделенные новыми строками). Я думаю, что при поиске адресов вы чаще всего будете искать в адресной строке, содержащей номер улицы, поэтому, возможно, в логике вашей программы вы убедитесь, что строка номера улицы всегда сохраняется в первом поле «улица», которое Затем вы можете добавить индекс в вашей базе данных.

С другой стороны, если большинство ваших адресов будут состоять из многострочных улиц и иметь более двух линий, то имеет смысл создать эту вторую модель.

Если вы не знаете заранее и не возражаете против «миграции» в будущем, выберите более простую модель. В противном случае, перейдите на ваш двухмодельный дизайн.

...