У меня сложная модель базы данных, настроенная в Django, и я должен выполнить ряд вычислений на основе данных фильтра. У меня есть объект Test
, объект TestAttempt
и объект UserProfile
(с внешним ключом для тестирования и внешним ключом для пользовательского профиля). Существует метод, который я запускаю на TestAttempt
, который вычисляет оценку теста (основываясь на количестве предоставленных пользователем вариантов по сравнению с правильными ответами, связанными с каждым тестом). И затем другой метод, который я использую для Test
, который вычисляет среднюю оценку теста на основе каждого из связанных с ним TestAttempt
. Но иногда мне нужно только среднее значение на основе предоставленного подмножества связанных TestAttempt
, которые связаны с определенным набором UserProfiles
. Таким образом, вместо того, чтобы вычислять средний балл теста для определенного теста следующим образом:
[x.score() for x in self.test_attempts.all()]
и затем усреднение этих значений.
Я делаю запрос, как это:
[x.score() for x in self.test_attempts.filter(profile__id__in=user_id_list).all()]
где user_id_list
- это определенное подмножество идентификаторов UserProfile, для которого я хочу найти среднюю оценку теста в виде списка. Мой вопрос таков: если user_id_list
действительно является полным набором UserProfile
(поэтому фильтр будет возвращать то же, что и self.test_attempts.all()
), и большую часть времени это будет иметь место, стоит ли платить за проверку этот случай, а если так, то не выполнить фильтр вообще? или поиск __in достаточно эффективен, так что даже если user_id_list
содержит всех пользователей, будет эффективнее запустить фильтр. Кроме того, мне нужно беспокоиться о том, чтобы сделать результирующий test_attempts отличным ()? или они не могут найти дубликаты со структурой моего набора запросов?
РЕДАКТИРОВАТЬ: Для тех, кто заинтересован в просмотре необработанного SQL-запроса, это выглядит без фильтра:
SELECT "mc_grades_testattempt"."id", "mc_grades_testattempt"."date",
"mc_grades_testattempt"."test_id", "mc_grades_testattempt"."student_id" FROM
"mc_grades_testattempt" WHERE "mc_grades_testattempt"."test_id" = 1
и это с фильтром:
SELECT "mc_grades_testattempt"."id", "mc_grades_testattempt"."date",
"mc_grades_testattempt"."test_id", "mc_grades_testattempt"."student_id" FROM
"mc_grades_testattempt" INNER JOIN "mc_grades_userprofile" ON
("mc_grades_testattempt"."student_id" = "mc_grades_userprofile"."id") WHERE
("mc_grades_testattempt"."test_id" = 1 AND "mc_grades_userprofile"."user_id" IN (1, 2, 3))
обратите внимание, что массив (1,2,3) является просто примером