From 7be5975d88b5658fd9fb8d9abf4c06105cd2edea Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Wed, 5 Aug 2026 13:53:03 -0600 Subject: [PATCH] =?UTF-8?q?feat(problemset):=20=E7=94=A8=E6=88=B7=E5=A5=96?= =?UTF-8?q?=E7=AB=A0=E6=8E=A5=E5=8F=A3=E5=B8=A6=E5=87=BA=E6=89=80=E5=B1=9E?= =?UTF-8?q?=E9=A2=98=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 成就页的奖章列表只有奖章本身,看不出来自哪个题单。UserBadgeSerializer 补一个 problemset 字段,查询改 select_related("badge__problemset") —— 这是 异步视图,不预加载会在异步上下文里发同步查询。 --- problemset/serializers.py | 7 +++++++ problemset/views/oj.py | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/problemset/serializers.py b/problemset/serializers.py index 9a48e18..c04e494 100644 --- a/problemset/serializers.py +++ b/problemset/serializers.py @@ -287,11 +287,18 @@ class UserBadgeSerializer(serializers.ModelSerializer): """用户奖章序列化器""" badge = ProblemSetBadgeSerializer() + # 成就页只拿到奖章本身,看不出是哪个题单发的,这里把题单带出来。 + # 只在这个序列化器上加:题单详情页里的奖章列表本来就在题单上下文中,不需要 + problemset = serializers.SerializerMethodField() class Meta: model = UserBadge fields = "__all__" + def get_problemset(self, obj): + problemset = obj.badge.problemset + return {"id": problemset.id, "title": problemset.title} + class JoinProblemSetSerializer(serializers.Serializer): """加入题单序列化器""" diff --git a/problemset/views/oj.py b/problemset/views/oj.py index b79b6b0..85d3475 100644 --- a/problemset/views/oj.py +++ b/problemset/views/oj.py @@ -283,12 +283,12 @@ class UserBadgeAPI(AsyncAPIView): # 获取指定用户的徽章 try: target_user = await User.objects.aget(username=username, is_disabled=False) - badges = UserBadge.objects.select_related("badge").filter(user=target_user).order_by("-earned_time") + badges = UserBadge.objects.select_related("badge__problemset").filter(user=target_user).order_by("-earned_time") except User.DoesNotExist: return self.error("用户不存在") else: # 获取当前用户的徽章 - badges = UserBadge.objects.select_related("badge").filter(user=request.user).order_by("-earned_time") + badges = UserBadge.objects.select_related("badge__problemset").filter(user=request.user).order_by("-earned_time") badge_list = [badge async for badge in badges] return self.success(await self.async_serialize_data(UserBadgeSerializer, badge_list, many=True))