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))