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')