Я пытаюсь получить счетчик поля alternative
по определенному вопросу, используя один набор запросов. Я попробовал это:
Answer.objects.filter(
evaluation_instance=EvaluationInstance(code=code),
alternative__in=[1,2,3,4,5],question__type_question='RA'
).values('alternative')
.annotate(count=Count('alternative'))
И я получил
вывод:
<QuerySet [{'alternative': 1, 'count': 2},
{'alternative': 2, 'count': 4},
{'alternative': 3, 'count': 4},
{'alternative': 4, 'count': 4},
{'alternative': 5, 'count': 18}]>
, но мне нужно знать, сколько ответов с 5 (или 4 или ..)1) имеет один вопрос, поэтому я добавил idquestion в набор запросов:
Answer.objects.filter(
evaluation_instance=EvaluationInstance(code=code),
alternative__in=[1,2,3,4,5],
question__type_question='RA'
).values('alternative', 'question__id').annotate(count=Count('alternative'))
Но я получил это:
<QuerySet [{'alternative': 1, 'question__id': 5, 'count': 1},
{'alternative': 1, 'question__id': 13, 'count': 1},
{'alternative': 2, 'question__id': 4, 'count': 1},
{'alternative': 2, 'question__id': 6, 'count': 1},
{'alternative': 2, 'question__id': 12, 'count': 1},
{'alternative': 2, 'question__id': 14, 'count': 1},
{'alternative': 3, 'question__id': 3, 'count': 1},
{'alternative': 3, 'question__id': 7, 'count': 1},
{'alternative': 3, 'question__id': 11, 'count': 1},
{'alternative': 3, 'question__id': 15, 'count': 1},
{'alternative': 4, 'question__id': 2, 'count': 1},
{'alternative': 4, 'question__id': 8, 'count': 1},
{'alternative': 4, 'question__id': 10, 'count': 1},
{'alternative': 4, 'question__id': 16, 'count': 1},
{'alternative': 5, 'question__id': 1, 'count': 2},
{'alternative': 5, 'question__id': 2, 'count': 1},
{'alternative': 5, 'question__id': 3, 'count': 1},
{'alternative': 5, 'question__id': 4, 'count': 1},
{'alternative': 5, 'question__id': 5, 'count': 1},
{'alternative': 5, 'question__id': 6, 'count': 1},
'...(remaining elements truncated)...']>
Есть ли способ получить это в одном наборе запросов? Примерно так:
<QuerySet [{'question__id':1,'alternative': 1, 'count': 2},
{'question__id':1,'alternative': 2, 'count': 4},
{'question__id':1,'alternative': 5, 'count': 3},
{'question__id':2,'alternative': 3, 'count': 6},
{'question__id':2,'alternative': 5, 'count': 3},
...]>
Или мне нужно сделать набор запросов для каждой альтернативы? Я думаю, что я делаю что-то не так. Вот модели, которые я использую:
Модель вопроса
class Question(models.Model):
TYPE_QUESTION = (
('RE', 'Written'),
('RA', 'Alternatives'),
('RN', 'Alt. Numeric')
)
activity = models.ForeignKey(Activity, on_delete=models.CASCADE)
question = models.CharField(max_length=250,default="")
type_question = models.CharField(max_length=2, choices=TYPE_QUESTION, default='RA')
Модель ответа
class Answer(models.Model):
user = models.ForeignKey(auth_user, on_delete=models.CASCADE)
evaluation_instance = models.ForeignKey(EvaluationInstance, on_delete=models.CASCADE)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
text = models.TextField(default="")
alternative = models.PositiveSmallIntegerField(default=0)
Спасибо!