我有以下2个模型:
class User(model.Models):
username = models.CharField(max_length=20, unique=True)
class Walk(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='walks')
creation_date = models.DateTimeField(auto_now_add=True)
distance = models.IntegerField()
我想获得一个列表User
并注释过去 n 天内每个用户步行的平均每日总距离。乍一看,这看起来微不足道,但在单个查询中而不是在循环中执行此操作很痛苦。理想的查询如下所示:users = User.objects.annotate(average=Subquery(subquery))
. 但我无法管理它,而是考虑制作两个子查询注释:一个用于总步行距离,另一个用于不同天数。那我就干脆做total_distance / days
。但是我如何查询不同的日子呢?
这就是我所拥有的,这显然行不通。
subquery = (
Walk.objects
.filter(user__pk=OuterRef('pk'), creation_date__gte=start_date)
.annotate(date=TruncDate('creation_date'))
.values('date')
.annotate(sum=Sum('distance'))
)
users = User.objects.annotate(
total_distance=Sum('walks__distance', filter=Q(walks__user__pk=F('pk'), walks__creation_date__gte=start_date)),
number_of_distinct_days=subquery
)