Запросы на выбор в Django с помощью annotate
Я застрял в django annotate query.
вот определенная модель, над которой я работал.
class Claim(model.Model)
CLAIMS_STATUS_CHOICES = (
(2, PROCESSING),
(1, ACCEPTED),
(0, REJECTED)
)
status = models.CharField(max_length=10,choice=CLAIMS_STATUS_CHOICES)
Проблема в том, что я не хочу аннотировать выбор обработки, а просто хочу получить индивидуальный подсчет статусов принятых и отклоненных. Вот что я пробовал.
claim = Claim.objects.filter(Q(status=1) | Q(status=0))
total_status_count = claim.count()
status_counts = Claim.objects.filter(Q(status=1) |Q(status=0)).annotate(count=Count('status')).values('count', 'status')
но я получаю множество отклоненных и принятых запросов вот что я получил в качестве оп
[
{
"total_claims": 3,
"status_count": [
{
"status": "1",
"count": 1
},
{
"status": "0",
"count": 1
},
{
"status": "1",
"count": 1
}
]
}
]
то, что я хотел
[
{
"total_claims": 3,
"status_count": [
{
"status": "1",
"count": 2
},
{
"status": "0",
"count": 1
}
]
}
]
Есть ли помощь по этому поводу?
Claim.objects.exclude(status=2).values('status').annotate(count=Count('status'))
Я решал подобную задачу в своем проекте, где мне нужно подсчитать общее количество завершенных и незавершенных проектов. В моем случае, сценарий таков, что каждый проект имеет статус. В модели проекта статус - это поле выбора, которое имеет варианты (загружен, в процессе, на рассмотрении и завершен).
Я размещаю запрос здесь, возможно, кому-то он покажется полезным. В API напишите следующий запрос:
from django.db.models import Count, Q
project_counts = Project.objects.filter(user=self.request.user).aggregate(
total=Count('id'),
inprogress=Count('id', Q(status=Project.ProjectStatus.IN_PROGRESS)),
completed=Count('id', Q(status=Project.ProjectStatus.COMPLETED)))
и затем вернуть ответ следующим образом.
return response.Response({
'total': project_counts['total'] | 0,
'inprogress': project_counts['inprogress'] | 0,
'completed': project_counts['completed'] | 0
})