我有两个类似的模型:
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对象,它们将继续增长。
我最终使用的是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'))
一个问题仍然存在,这个问题可能会持续一个月,但出于我的目的,我可以忍受这个问题。