2011-10-08 22 views
16

Necesito modelar una dirección postal que puede tener la dirección de varias líneas, la ciudad, el estado (provincia) y el código postal. el país está omitidocómo modelar una dirección postal

Necesito preservar los saltos de línea en las direcciones pero todavía puedo buscar las direcciones.

Veo dos maneras de hacerlo:

 
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()
o este otro que almacena la dirección de la calle en un solo campo de texto sino que utiliza caracteres especiales de separación para codificar los saltos de línea:
 
class Address(models.Model): 
    street = models.TextField() 
    city = models.TextField() 
    province = models.TextField() 
    code = models.TextField() 
¿cuál es la mejor manera de hacerlo en términos de legibilidad y eficiencia del código (o su equilibrio)?

Respuesta

3

A menos que la mayoría de sus direcciones tengan partes de calles de varias líneas (y tengan muchas líneas), iré por la última, almacenando todo en un solo campo y sin molestar con un modelo adicional. Si la mayoría de las direcciones de varias líneas son solo dos, considere crear un campo calle y calle2 en su modelo de Dirección (puede elegir nombres más descriptivos para estos dos campos "calle"). El primero almacenaría la primera línea de la calle, y el segundo campo almacenaría todas las líneas adicionales (separadas por líneas nuevas). Creo que al buscar direcciones, lo más frecuente es que busque en la línea de dirección que contiene el número de calle, así que tal vez en la lógica de su programa se asegure que la línea de número de calle siempre esté almacenada en el primer campo "calle", que luego puede agregar un índice en su base de datos.

Por otro lado, si la mayoría de sus direcciones tendrán partes de calle de varias líneas y tienen más de dos líneas, entonces tiene sentido crear ese segundo modelo.

Si no sabe de antemano, y no le importa potencialmente "migrar" en el futuro, busque el modelo más simple. De lo contrario, elija su diseño de dos modelos.

11

Así es cómo modelizo las direcciones para los EE. UU. También puede almacenar un código postal de 10 dígitos (XXXXX-XXXX) si lo necesita.

También puede considerar agregar un campo de punto, o un campo poli de geodjango, dependiendo de para qué utilice las direcciones.

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

Desde Django 1.4, localflavor ya no se incluye con Django. Entonces, para usar este código uno debe instalarlo a mano: 'pip install django_localflavor_us' e importar USStateField de la siguiente manera:' from django_localflavor_us.models import USStateField'. – Altaisoft

+0

¿Cómo podríamos modelar cualquier dirección en general y no solo una dirección de EE. UU.? –

+1

El consejo que dio @Altaisoft no está actualizado. Desde esa página de pypi: "Advertencia: paquete obsoleto No debe usar este paquete por más tiempo. El anterior paquete django.contrib.localflavor ahora está disponible como el paquete https://pypi.python.org/pypi/django-localflavor, incluyendo el sabor local de los Estados Unidos ". Así que el equivalente ahora es 'pip install django-localflavor' &' de localflavor.models import USStateField' –

7

Tengo algunas preguntas acerca de su Domicilio:

  1. son los datos ya verificados hasta el punto de entrega?
  2. Si es así, ¿tiene un porcentaje alto que todavía tiene más de una línea de entrega (calle)?

La mayoría de las direcciones de entrega solo tienen una línea. Muchas personas erróneamente colocan información secundaria (número de unidad) en la segunda línea de entrega. Esto va en contra de los estándares de USPS (ver USPS publication 28). Por lo tanto, le recomiendo que verifique los datos de su dirección usando un proveedor CASS-Certified para que sepa que las direcciones con las que está tratando son reales y estandarizadas. Entonces, probablemente estará en una mejor posición para analizar sus datos y tomar una decisión sobre cómo almacenarlos. Supongo que después de realizar la verificación de dirección en su base de datos no tendrá muchas (si las hay) dirección con más de una línea de entrega. Tendría que decidir en ese momento si vale la pena tener un campo separado para él o mantenerlo en un solo campo delimitado por un salto de línea.

Descripción completa: Soy un desarrollador de software para SmartyStreets, una empresa de verificación de direcciones y un vendedor certificado por CASS.

Cuestiones relacionadas