如何获取查询集中6个第一个元素的平均值并在Django中注释该值?

问题描述 投票:2回答:1

我有两个类似的模型:

class Foo(models.Model):
    name = models.CharField(max_length=30)

class FooStatement(models.Model):
    foo = models.ForeignKey(Foo, on_delete.models.CASCADE)
    revenue = models.DecimalField(decimal_places=2)
    date = models.DateField()

我想知道的是每个Foo对象的前6个日期的FooStatement收入的平均值。有没有办法实现这个目标?

我正在考虑切割前6个条目(在订购之后),但我似乎无法让它工作。声明几个月都在不同的日期开始,所以我不能只说我希望所有日期都小于'x'。

我几乎肯定答案在于巧妙的注释,但我找不到它。

编辑:带有postgres数据库的Django版本1.11.6。有超过4000个Foo对象,它们将继续增长。

python django
1个回答
0
投票

我最终使用的是F表达式。虽然不是一个理想的解决方案,但它涵盖了大约90%的陈述。我在第一个月注释,然后选择在某个日期之前的所有混凝土,并汇总平均值:

qs = Foo.objects.all().annotate(f_month=Min(F('foostatement__date')))
value = qs.filter(foostatement__date__lt=F('f_month')+datetime.timedelta(6*365/12)).aggregate(Avg('foostatement__revenue'))

一个问题仍然存在,这个问题可能会持续一个月,但出于我的目的,我可以忍受这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.