Это связано с этим вопросом, однако немного отличается .
Для простоты скажем, что у меня есть модели (с использованием Django 1.7):
class TimesheetEntry(models.Model):
date = models.DateField()
employee = models.CharField(max_length=255)
hours = models.FloatField()
class OnCallEntry(models.Model)
timesheet = models.ForeignKey(TimesheetEntry)
minutes = models.FloatField()
comment = models.CharField(max_length=255)
Где для определенного TimesheetEntry/day может быть несколько OnCallEntries, каждая из которых имеет количество минут, потраченных на вызов. Я хочу запросить сумму всех часов, отработанных сотрудником, а также общее количество минут, потраченных на вызов.
Для этого у меня есть запрос:
query = TimesheetEntry.objects.all().filter(employee="John Smith").aggregate(
total_hours = Sum('hours'),
total_oncall_minutes = Sum('oncallentry__minutes')
)
Однако если для данного TimesheetEntry существует более одного OnCallEntry, количество часов для отдельного TimesheetEntry умножается на количество OnCallEntries, что приводит к искажению суммы total_hours. (Из того, что я читал, это связано с тем, как django обрабатывает соединения). И когда я не включаю часть total_oncall_minutes, все работает, как и ожидалось.
Что касается части total_hours, я хочу получить только сумму для отдельных записей расписания. И я бы предпочел сделать все это в одном запросе, так как на самом деле у меня есть еще больше агрегатных функций, которые я хочу выполнить с другими связанными моделями.
Я пробовал все варианты добавления отдельного ключевого слова, например:
...Sum('hours', distinct=True)..
...Sum('oncallentry__minutes', distinct=True)..
...filter(employee="John Smith").distinct().aggregate(...
Но это, похоже, не сработало. Любая помощь будет оценена по достоинству!
Спасибо