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'

リストcompを実行し、値がNoneでないかどうかを確認し、それらを文字列に変換して、タイプに関係なく適切に結合します。

于 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 に答える