fix list submissions
This commit is contained in:
@@ -5,6 +5,7 @@ from ninja.errors import HttpError
|
|||||||
from ninja.pagination import paginate
|
from ninja.pagination import paginate
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.db.models import OuterRef, Subquery, IntegerField
|
||||||
|
|
||||||
|
|
||||||
from .schemas import (
|
from .schemas import (
|
||||||
@@ -55,19 +56,20 @@ def list_submissions(request, filters: SubmissionFilter = Query(...)):
|
|||||||
if filters.username:
|
if filters.username:
|
||||||
submissions = submissions.filter(user__username__icontains=filters.username)
|
submissions = submissions.filter(user__username__icontains=filters.username)
|
||||||
|
|
||||||
# 获取所有提交
|
user_rating_subquery = Subquery(
|
||||||
submissions = submissions.prefetch_related("ratings")
|
Rating.objects.filter(user=request.user, submission=OuterRef("pk")).values(
|
||||||
|
"score"
|
||||||
# 获取当前用户的评分
|
)[:1],
|
||||||
user_ratings = {
|
output_field=IntegerField(),
|
||||||
rating.submission_id: rating.score
|
)
|
||||||
for rating in Rating.objects.filter(
|
submissions = submissions.annotate(my_score=user_rating_subquery)
|
||||||
user=request.user,
|
|
||||||
submission__in=submissions
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return [SubmissionOut.list(submission, user_ratings) for submission in submissions]
|
def get_submission_data(submission):
|
||||||
|
"""从 submission 对象构建 SubmissionOut 数据"""
|
||||||
|
my_score = getattr(submission, "my_score", None) or 0
|
||||||
|
return SubmissionOut.list(submission, {submission.id: my_score})
|
||||||
|
|
||||||
|
return [get_submission_data(submission) for submission in submissions]
|
||||||
|
|
||||||
|
|
||||||
@router.get("/{submission_id}", response=SubmissionOut)
|
@router.get("/{submission_id}", response=SubmissionOut)
|
||||||
|
|||||||
Reference in New Issue
Block a user