Django - как получить среднее время человека, который ответил на вопрос

Я хотел бы получить среднее время ответов каждого человека.

Модель:

class Person(models.Model):
  uid = models.UUIDField(default=uuid.uuid4, primary_key=True)
  first_name = models.CharField(max_length=255, blank=True)
  last_name = models.CharField(max_length=255, blank=True)
  email = CIEmailField()


class CoursePerson(models.Model):
  uid = models.UUIDField(primary_key=True, default=uuid.uuid4)
  course = models.ForeignKey(
      Course, related_name="courses_persons", on_delete=models.CASCADE
  )
  person = models.ForeignKey(
      "Person", related_name="courses", on_delete=models.CASCADE
  )
  created_at = models.DateTimeField(auto_now_add=True)
  start_at = models.DateTimeField()


class CoursePersonPasswordFormSubmission(models.Model):
  uid = models.UUIDField(primary_key=True, default=uuid.uuid4)
  text_mask = models.CharField(max_length=255)
  text_length = models.IntegerField()
  created_at = models.DateTimeField(auto_now_add=True)
  course_person = models.ForeignKey(
      CoursePerson, related_name="password_submissions", on_delete=models.CASCADE
  )

Я начал писать функцию def_queryset. Все в начале нормально, так как мне нужно отфильтровать материал перед тем, как сделать эту логику:

def get_queryset(self):
   accounts = get_account_ids(self.request)

   course_person_queryset = CoursePerson.objects.filter(
      account__in=accounts, 
      is_in_analytics=True,
      status__gte=CoursePerson.StatusChoices.OPEN,
        course__type="form"
   )

   course_person_queryset = filter_base_analytics(
      self.request,
      course_person_queryset,
      date_start=self.request.GET["date_start"],
      date_end=self.request.GET["date_end"],
   )

   ...I'm blocked here...

Но теперь мне нужно вывести список людей с их средним временем задержки ответа. То есть, время отправления начального сообщения пользователю - course_person__start_at, а время ответа человека - password_submissions__created_at

что я пробовал:

person_queryset = models.Person.objects.filter(
   courses__in=course_person_queryset.values_list('uid', flat=True),
   courses__password_submissions__created_at__isnull=False,
   courses__emails_person__opened_at__isnull=False,
    ).annotate( average_form_delay=Avg(F('courses__password_submissions__created_at') - F("courses__start_at")))

Но это не может работать, поскольку у человека может быть несколько курсовых_персон. и эти курсовые_персоны могут иметь несколько парольных_записей. Поэтому с таким кодом персоны могут быть продублированы, если они имеют несколько записей.

Вернуться на верх