refactor: replace sync_to_async aggregate with aaggregate in CommentStatisticsAPI

This commit is contained in:
2026-05-26 21:44:56 -06:00
parent e47923758e
commit b041de8c4a

View File

@@ -1,15 +1,15 @@
from django.db.models import Avg, Count
from django.db.models.functions import Round
from account.decorators import login_required
from django.db.models import Avg, Count
from django.db.models.functions import Round
from account.decorators import login_required
from comment.models import Comment
from comment.serializers import CommentSerializer, CreateCommentSerializer
from problem.models import Problem
from submission.models import JudgeStatus, Submission
from utils.api import AsyncAPIView
from utils.api.api import validate_serializer
from utils.async_helpers import async_cache_delete, async_cache_get, async_cache_set
from utils.constants import CacheKey
from submission.models import JudgeStatus, Submission
from utils.api import AsyncAPIView
from utils.api.api import validate_serializer
from utils.async_helpers import async_cache_delete, async_cache_get, async_cache_set
from utils.constants import CacheKey
class CommentAPI(AsyncAPIView):
@@ -48,8 +48,8 @@ class CommentAPI(AsyncAPIView):
comprehensive_rating=data["comprehensive_rating"],
content=data["content"],
)
await async_cache_delete(f"{CacheKey.comment_stats}:{problem.id}")
return self.success()
await async_cache_delete(f"{CacheKey.comment_stats}:{problem.id}")
return self.success()
@login_required
async def get(self, request):
@@ -58,25 +58,22 @@ class CommentAPI(AsyncAPIView):
Comment.objects.select_related("problem")
.filter(user=request.user, problem_id=problem_id)
.afirst()
)
if comment:
return self.success(await self.async_serialize_data(CommentSerializer, comment))
else:
return self.success()
)
if comment:
return self.success(await self.async_serialize_data(CommentSerializer, comment))
else:
return self.success()
class CommentStatisticsAPI(AsyncAPIView):
async def get(self, request):
problem_id = request.GET.get("problem_id")
cache_key = f"{CacheKey.comment_stats}:{problem_id}"
cached = await async_cache_get(cache_key)
if cached is not None:
return self.success(cached)
problem_id = request.GET.get("problem_id")
cache_key = f"{CacheKey.comment_stats}:{problem_id}"
cached = await async_cache_get(cache_key)
if cached is not None:
return self.success(cached)
from asgiref.sync import sync_to_async
agg = await sync_to_async(
Comment.objects.filter(problem_id=problem_id).aggregate
)(
agg = await Comment.objects.filter(problem_id=problem_id).aaggregate(
count=Count("id"),
description=Round(Avg("description_rating"), 2),
difficulty=Round(Avg("difficulty_rating"), 2),
@@ -90,5 +87,5 @@ class CommentStatisticsAPI(AsyncAPIView):
"difficulty": agg["difficulty"],
"comprehensive": agg["comprehensive"],
}}
await async_cache_set(cache_key, data, 3600)
return self.success(data)
await async_cache_set(cache_key, data, 3600)
return self.success(data)