2012-07-01 25 views
5

varlığına bağlı olarak bir dize birleştirin "adres" adlı bir Django modelinde bir özellik oluşturuyorum. Adresimin, modelimde sahip olduğum bir dizi alanın birleşiminden oluşmasını istiyorum. Sorun, bu modelin tüm örneklerinin bu alanların tümü için değerlere sahip olmamasıdır. Yani, sadece değerleri olan alanları birleştirmek istiyorum.Python/Django Bu dize

Bunu yapmanın en iyi/en çok Pythonic yolu nedir? Sadece böyle bir şey yapabileceğini

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) 

: sonuçta

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) 

ama sonra olacağını ekstra boşluk İşte

modelinden alakalı alanlardır.

Her birinde bir dizi ifade varsa ve bir dizi yapabilirim, ancak bu çirkin görünüyor.

Bu durumun üstesinden gelmenin en iyi yolu nedir?

Teşekkürler.

cevap

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' 

Sadece bir liste comp yapmak ve herhangi bir değer Hiçbiri değilse işaretleyin ve ayrıca bunların düzgün türden bağımsız katılmak böylece bir dizeye dönüştürmek.

+0

'Yok Yok' ilavesi için teşekkürler –

+0

@DouglasMeehan: Sure. Ayrıca, yöntemi her çağırdığınızda geçici bir liste oluşturmaya kaydetmek isterseniz, örnekler arasında değişmeyeceği için alanları bir sınıf özniteliği olarak kaydedebilirsiniz. – jdi

+0

Bu durumda daha iyi olan nedir? tuple veya liste? –

2

Sadece Falsy olmayan değerleri almak için bir jeneratörü kullanırım ve sonra onlara katılırdım. Örneğin:

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

Falsey değeri değil, Yok seçeneğini işaretlemeniz gerekir. Hiçbiri – jdi

+0

geçerli bir 0 ile aynı değildir, bu durumda parça = (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self yapabilirim) .stdes, self.stdessuf) return "" .join (s değil ise, parçalar için s için str (s))? –

+0

@jdi bunu işaret ettiğin için teşekkürler! – cberner

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

Bu alan bir dize değilse kesilir. – jdi