From a2f0ce334edf97a52fb49da5fcbe662932f58597 Mon Sep 17 00:00:00 2001 From: yuetsh <51725939@qq.com> Date: Tue, 4 Jun 2024 09:15:37 +0800 Subject: [PATCH] groupby username --- submission/views/admin.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/submission/views/admin.py b/submission/views/admin.py index e19fbbc..a955d89 100644 --- a/submission/views/admin.py +++ b/submission/views/admin.py @@ -4,6 +4,7 @@ from judge.tasks import judge_task from utils.api import APIView from ..models import Submission, JudgeStatus from problem.models import Problem +from django.db.models import Count, Q class SubmissionRejudgeAPI(APIView): @@ -49,17 +50,29 @@ class SubmissionStatisticsAPI(APIView): if username: submissions = submissions.filter(username__icontains=username) - total_count = submissions.count() + submission_count = submissions.count() accepted_count = submissions.filter(result=JudgeStatus.ACCEPTED).count() try: - correct_rate = round(accepted_count/total_count*100, 2) + correct_rate = round(accepted_count/submission_count*100, 2) except ZeroDivisionError: correct_rate = 0 + counts = submissions.values("username").annotate(submission_count=Count("id", distinct=True), + accepted_count=Count("id", filter=Q(result=JudgeStatus.ACCEPTED), distinct=True), + ).order_by("-submission_count") + + data = [] + for item in counts: + if item["accepted_count"] > 0: + rate = round(item["accepted_count"]/item["submission_count"]*100, 2) + item["correct_rate"] = f"{rate}%" + data.append(item) + return self.success({ - "submission_count": total_count, + "submission_count": submission_count, "accepted_count": accepted_count, "correct_rate": f"{correct_rate}%", + "data": data, }) \ No newline at end of file