Django: как подсчитать количество групп подзапроса?
У меня есть следующие 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
)