Есть ли способ, используя queryset, для получения количества для определенного поля с более чем 3 значениями, используя модель Count? - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь получить счетчик поля 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)

Спасибо!

...