Django сложный запрос с медленной загрузкой страницы
У меня есть приложение викторины, сделанное с помощью Django. В основном я загружаю довольно сложный запрос. По сути, я создаю новый экзамен с такой логикой:
- Получение вопроса из банка вопросов (модель
Question
) - Я получаю определенное количество вопросов из каждого предмета и использую их для создания
QuestionDraft
, чтобы я мог хранить и сохранять результаты каждого студента. - У каждого
QuestionDraft
естьAnswerDraft
, который я использую для хранения вопросов, на которые ответил пользователь (каждыйAnswerDraft
по сути является копией банка вопросовAnswer
).
Пока я хочу загрузить тест из 50 вопросов, все работает довольно хорошо, но когда я хочу загрузить больше, чем это количество вопросов, страница загружается очень медленно. Я хотел бы знать, можно ли, основываясь на моделях и коде, который я размещу ниже, как-то улучшить эффективность запросов и/или время загрузки
models.py
views.py
def ppl_exam_generator_util(request, subjects):
question_list = [Question.objects.filter(question_subject=subject).order_by(
'?')[:int(subject.exam_questions_num)]for subject in subjects]
quiz_profile = QuizProfile(
user=request.user, quiz_type='ppl_exam')
quiz_profile.save()
for ques in question_list:
for q in ques:
question = Question.objects.get(id=q.id)
quiz_attempt = QuizAttempt(quiz_profile=quiz_profile,
question=question)
quiz_attempt.save()
question_draft = QuestionDraft(
question=question, text=question.text, quiz_profile=quiz_profile)
question_draft.save()
quiz_draft = QuizDraft(
quiz_profile=quiz_profile, question_draft=question_draft)
quiz_draft.save()
answers = Answer.objects.filter(question__id=question.id)
shuffle(list(answers))
for ans in answers:
draft_answer = AnswerDraft(
question_draft=question_draft, answer=ans, text=ans.text, quiz_profile=quiz_profile)
draft_answer.save()
return HttpResponseRedirect(reverse('quiz:new_ppl_exam', kwargs={'pk': quiz_profile.id}))
Я пробовал также использовать инструмент connection.queries
, который предоставляет Django, но каждый запрос выполняется довольно быстро. Я не знаю, проблема ли это со вложенным forloop или что-то еще.