5

我正在一个名为“地址”的 Django 模型上创建一个属性。我希望地址由我的模型上的多个字段的串联组成。问题在于,并非此模型的所有实例都具有所有这些字段的值。所以,我只想连接那些有值的字段。

最好/最 Pythonic 的方法是什么?

以下是模型中的相关字段:

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

3 回答 3

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'

您只需做一个列表比较,并检查是否有任何值不是无,并将它们转换为字符串,以便它们正确连接而不管类型如何。

于 2012-07-01T21:14:16.873 回答
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)
于 2012-07-01T21:12:11.393 回答
2
" ".join(filter(None, 
               [self.house, self.suf, self.unit, 
                self.stex, self.stdir, self.stname, 
                self.stdes, self.stdessuf]))
于 2012-07-01T21:17:56.387 回答