现状:
model.py
class Foo(models.model):
name = models.CharField(max_length = 50, blank = True, unique = True)
class Item(models.model):
foo = models.ForeignKey('Foo')
number = models.PositiveIntegerField()
views.py
def index(request):
stats= Foo.objects.filter(somecond=somevalue).\
annotate(count=Count('item__number'), max=Max('item__number'))
return render_to_response('stats.html', {'stats' : stats})
预期的结果是具有附加字段的对象列表Foo:包含与Foo和max相关的项目数的count - 项目的最大数量。
示例:
Item1: Foo1, 12
Item2: Foo2, 100
Item3: Foo1, 10
Item4: Foo2, 78
Item5: Foo1, 6
结果:
统计数据:
Foo1, 3, 12
Foo2, 2, 100
奥莱特。 现在我想获得更多:
class sell(models.Model):
foo = models.ForeignKey('Foo')
value = models.DecimalField(max_digits=10,decimal_places=2)
填写:
sell1: Foo1, 12.50
sell2: Foo2, 12.40
sell3: Foo1, 4.12
sell4: Foo2, 10.00
stats=Foo.objects.filter(somecond=somevalue).\
annotate(Count('item__number'), Max('item__number'), Sum('sell__value'))
我的期望是:
统计数据:
Foo1, 3, 12, 16.62
Foo2, 2, 100, 22.40
但结果是项目和值的数量增加(例如,如果卖出元素为1,并且有4个Foos,则总和为4 * sell.value)
我也尝试了Sum(' sell__value',distinct = True),但没有区别。
我想要它用于模板,我想用循环法做
{% for foo in stats %}
<h2>{{ foo.name }} </h2>
{{foo.count}}/{{foo.max}}
sum of sell related with foo
{{foo.sum}}
我希望将总和插入统计数据。
答案 0 :(得分:0)
您可以找到https://stackoverflow.com/a/40443262/354420
的一种可能性您必须使用自己的QuerySet创建自己的Manager:
然后
both = Foo.objects.annotate_sum(Sell, 'value')
答案 1 :(得分:0)
我选择解决方案
stats=Foo.objects.filter(somecond=somevalue).annotate(Count('item__number'), Max('item__number')).in_bulk()
sells=Foo.objects.filter(somecond=somevalue).annotate(Sum('sell__value')).in_bulk()
for key, stat in stats.items():
setattr(stat,'sell__value__sum',sells[key].sell__value__sum)
我知道in_bulk()调用两个sqls,但这对我来说不是问题。我的另一个答案是调用一个sql。