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")))
Но это не может работать, поскольку у человека может быть несколько курсовых_персон. и эти курсовые_персоны могут иметь несколько парольных_записей. Поэтому с таким кодом персоны могут быть продублированы, если они имеют несколько записей.