как смоделировать почтовый адрес

#django #geocoding

#django #геокодирование

Вопрос:

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

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

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

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

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

Ответ №1:

Вот как я моделирую адреса для США. Вы также можете сохранить 10-значный почтовый индекс (XXXXX-XXXX), если вам нужно.

Вы также можете рассмотреть возможность добавления поля point или поля poly из 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. Начиная с Django 1.4, localflavor больше не поставляется в комплекте с Django. Итак, чтобы использовать этот код, нужно установить его вручную: pip install django_localflavor_us и импортировать USStateField следующим образом: from django_localflavor_us.models import USStateField .

2. Как бы мы смоделировали любой адрес в целом, а не только адрес в США?

3. Совет, который дал @Altaisoft, устарел. С этой страницы pypi: «Предупреждение: устаревший пакет, вы больше не должны использовать этот пакет. Прежний пакет django.contrib.localflavor теперь доступен как pypi.python.org/pypi/django-localflavor упаковка, включая местную приправу из США». Итак, эквивалент теперь pip install django-localflavor amp; from localflavor.models import USStateField

Ответ №2:

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

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

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

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

Ответ №3:

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

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

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

Ответ №4:

Проверьте django-address .

Он предоставляет поле модели, в котором вы можете выполнить следующие действия

 from address.models import AddressField

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