#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. Да, я думаю, мне нужно будет разработать количество аннотаций, но это довольно сложная цепочка. Мне просто нужно уйти на час или около того, но я опубликую структуру, когда вернусь, так как я раздену все, что не нужно. Спасибо вам за ваш комментарий. «Удалось добавить, прежде чем я ушел», это более широкая вещь, над которой нужно поработать, но я пытаюсь разобраться по крупицам.