我有一个带Books的QuerySet,我想score为每个Book结果添加了一个字段。" @- y& x& G. T, X
qs = Book.objects.all()在原始SQL中,我会写: # d# d0 _% `3 @2 \2 V2 W2 r# V2 \! I. ESELECT *, ( (SELECT COUNT(*) FROM votes WHERE value=1 AND book=b.id) - (SELECT COUNT(*) FROM votes WHERE value=-1 AND book=b.id) ) AS scoreFROM Book b;如何在Django实现?我试过了annotate(),但似乎不适合这种东西。 7 z2 z# k) T( N2 f/ a- P# |7 ~ 6 g5 v* b6 o z$ a3 m; m 解决方案: , K4 Y4 T" N' M 如果票数可能只有1和-1.您可以使用刚才提到的总结注释:Book.objects.annotate(score=Sum('votes__value'))。 7 ?5 A( E' T" P8 ?* F如果有更多可能的值,可以添加.filter(votes__value__range=(1,1)在上述查询中过滤注释。8 j2 W7 B1 S# }( u C* R
如果是更复杂的,你将不得不使用extra与select。