2012-07-01 28 views
5

Estoy creando una propiedad en un modelo de Django llamado "dirección". Quiero que la dirección consista en la concatenación de varios campos que tengo en mi modelo. El problema es que no todas las instancias de este modelo tendrán valores para todos estos campos. Entonces, quiero concatenar solo aquellos campos que tienen valores.Python/Django Concatenar una cadena en función de si existe esa cadena

¿Cuál es la mejor/más Pythonic manera de hacer esto?

Éstos son los campos relevantes del modelo:

house = models.IntegerField('House Number', null=True, blank=True) 
suf = models.CharField('House Number Suffix', max_length=1, null=True, blank=True) 
unit = models.CharField('Address Unit', max_length=7, null=True, blank=True) 
stex = models.IntegerField('Address Extention', null=True, blank=True) 
stdir = models.CharField('Street Direction', max_length=254, null=True, blank=True) 
stnam = models.CharField('Street Name', max_length=30, null=True, blank=True) 
stdes = models.CharField('Street Designation', max_length=3, null=True, blank=True) 
stdessuf = models.CharField('Street Designation Suffix',max_length=1, null=True, blank=True) 

tan sólo pudiera hacer algo como esto:

def _get_address(self): 
    return "%s %s %s %s %s %s %s %s" % (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self.stdes, self.stdessuf) 

pero entonces no habría espacios en blanco adicionales en el resultado.

Podría hacer una serie de sentencias if y concatenar dentro de cada una, pero eso parece feo.

¿Cuál es la mejor manera de manejar esta situación?

Gracias.

Respuesta

4
parts = (1, 'a', 'b', 2, 'c', 'd', None, 'f') 
# parts = (self.house, self.suf, self.unit, 
#   self.stex, self.stdir, self.stname, 
#   self.stdes, self.stdessuf) 
' '.join(str(part) for part in parts if part is not None) 
# '1 a b 2 c d e f' 

Usted acaba de hacer un borrador de lista y comprueba si cualquier valor no es ninguno, y también convertir a una cadena para que se unan correctamente independientemente del tipo.

+0

Gracias por la adición de 'no ninguno' –

+0

@DouglasMeehan: Claro. Además, si desea guardar al crear una lista temporal cada vez que llama al método, puede guardar los campos en una lista como un atributo de clase, ya que no va a cambiar entre instancias. – jdi

+0

¿Qué es mejor en esta situación? tupla o lista? –

2

Usaría un generador para obtener solo los valores que no son de Falsy, y luego unirme a ellos. Por ejemplo:

parts = (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self.stdes, self.stdessuf) 
return " ".join(str(s) for s in parts if s is not None) 
+0

Debe comprobar Ninguno, y no un valor de Falsey. Ninguno no es lo mismo que 0, que es un número válido – jdi

+0

por lo que en ese caso, podría hacer partes = (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self .stdes, self.stdessuf) return "" .join (str (s) para s en partes si s no es None)? –

+0

@jdi ¡gracias por señalar eso! – cberner

1
" ".join(filter(None, 
       [self.house, self.suf, self.unit, 
       self.stex, self.stdir, self.stname, 
       self.stdes, self.stdessuf])) 
+0

Esto se rompe si el campo no es una cadena. – jdi

Cuestiones relacionadas