Django Model のAnnotateが難しくて少し悩んだ

Viewで

result = SomeModel.objects.filter(p=p).values('key__id').annotate(sum=models.Sum('value'))

って感じでannotateでとあるキーに合致するレコードのサマリをとろうとしたのだが、resultはQuerySetだから

result[0]['sum']

なんてアクセスするとエラー(list index out of range)がでて、あー、だめなのかって思った。そこで

result.first()['sum']

ってやると、あー動いた動いたって安心してたんだけども、どうも合計が10.0あるレコードも集計されてなくて1.0とかになっておかしい。first()のせいで、1レコード分だけをSumしている挙動と思われる・・・。[0]自体はよくて、集計対象の行がないときに[0]はエラーになっているというだけなのだった。つまりこれでよかった。

if(result.count == 0):
    val = 0
else:
    val = resuilt[0].get('sum')

なんかコードがすっきりしないけど、これくらいなら1行で書く方法が何かありそう。
PHPだと $a = ( $i == “OK” ? True : False ) みたいなのができたけどpythonもあるのかな。

追記:調べてたら見つけた。

val = 0 if result.count == 0 else result[0].get('sum')

Leave a Comment

Your email address will not be published. Required fields are marked *