Циклическое выполнение запросов Django

#arrays #django #django-queryset

Вопрос:

Я пытался разработать более эффективный способ сделать это ниже. Существует ли он вообще? Проблема в том, что я должен выполнить этот цикл 100 раз (в моем тестовом примере, но больше в реальной жизни), и в каждом цикле около 100 элементов, что делает его действительно довольно медленным. Должен быть способ сравнить результаты запроса, что-то вроде array.filter в JS. Но я, кажется, не могу найти его для Джанго.

 for choice in question.answer_choices.all():
     amount = 0
     for ans in q_answers:
         if choice in ans.answers.all():
                amount  = 1
 

Это в основном получение выбора ответов и подсчет количества совпадений, чтобы дать мне результат для каждого выбора из набора вариантов ответов.

q_answers-это просто массив ответов, которые были даны пользователем на «вопрос».

Редактировать:

Я сделал это немного эффективнее. Но все те же проблемы.

 for choice in question.answer_choices.all():
    matched_answers = [ans for ans in q_answers if choice in ans.answers.all()]
    amount = len(matched_answers)
 

Структура:

 class ReportUserAnswers(models.Model):
    question = models.ForeignKey(ReportQuestionnaireQuestion)
    text_answer = models.TextField(blank=True)
    answers = models.ManyToManyField(ReportQuestionAnswerChoices)
    images = models.ManyToManyField(ReportImage)

answers = (
     ReportUserAnswers.objects.filter()
       .select_related("question")
       .prefetch_related(
           "question__answer_choices", 
           "answers"
     )
            
)

q_answers = [answer for answer in answers if answer.question == question]
```
 

Комментарии:

1. Можете ли вы предоставить свои модели и где определен q_answer?

2. Да, я думаю, мне нужно будет разработать количество аннотаций, но это довольно сложная цепочка. Мне просто нужно уйти на час или около того, но я опубликую структуру, когда вернусь, так как я раздену все, что не нужно. Спасибо вам за ваш комментарий. «Удалось добавить, прежде чем я ушел», это более широкая вещь, над которой нужно поработать, но я пытаюсь разобраться по крупицам.