Django объединяет обратные отношения

Это связано с этим вопросом, однако немного отличается .

Для простоты скажем, что у меня есть модели (с использованием 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(...

Но это, похоже, не сработало. Любая помощь будет оценена по достоинству!

Спасибо


person Cortez1138    schedule 07.04.2015    source источник