2012-07-01 74 views
5

我在名爲「address」的Django模型上創建了一個屬性。我希望地址由我在模型上的多個字段的連接組成。問題是,並不是所有這些模型的實例都具有所有這些字段的值。所以,我想只連接那些有值的字段。Python/Django根據字符串是否存在來連接字符串

什麼是最好的/最Python的方式來做到這一點?

下面是該模型中的相關字段:

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) 

我可以做這樣的事情:在結果

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) 

但隨後會有額外的空格。

我可以做一系列if語句並在每個語句中連接,但看起來很醜。

處理這種情況的最佳方法是什麼?

謝謝。

回答

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' 

你只是做一個列表比較,並檢查是否值不爲None,並且也將其轉換爲一個字符串,使他們加入適當的類型無關。

+0

謝謝你的'不無' –

+0

@DouglasMeehan:當然。此外,如果您希望每次調用方法時都保存創建臨時列表,則可以將列表中的字段保存爲類屬性,因爲它不會在實例之間更改。 – jdi

+0

在這種情況下有什麼更好的?元組還是列表? –

2

我想用一個生成器來獲得非Falsy值,然後加入它們。例如:

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值。沒有不一樣的0這是一個有效的數字 – jdi

+0

所以在這種情況下,我可以做 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

@jdi謝謝指出! – cberner

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

如果該字段不是字符串,則會中斷。 – jdi