feat(problemset): 用户奖章接口带出所属题单

成就页的奖章列表只有奖章本身,看不出来自哪个题单。UserBadgeSerializer
补一个 problemset 字段,查询改 select_related("badge__problemset") —— 这是
异步视图,不预加载会在异步上下文里发同步查询。
This commit is contained in:
2026-08-05 13:53:03 -06:00
parent 8f5fee1719
commit 7be5975d88
2 changed files with 9 additions and 2 deletions

View File

@@ -287,11 +287,18 @@ class UserBadgeSerializer(serializers.ModelSerializer):
"""用户奖章序列化器""" """用户奖章序列化器"""
badge = ProblemSetBadgeSerializer() badge = ProblemSetBadgeSerializer()
# 成就页只拿到奖章本身,看不出是哪个题单发的,这里把题单带出来。
# 只在这个序列化器上加:题单详情页里的奖章列表本来就在题单上下文中,不需要
problemset = serializers.SerializerMethodField()
class Meta: class Meta:
model = UserBadge model = UserBadge
fields = "__all__" fields = "__all__"
def get_problemset(self, obj):
problemset = obj.badge.problemset
return {"id": problemset.id, "title": problemset.title}
class JoinProblemSetSerializer(serializers.Serializer): class JoinProblemSetSerializer(serializers.Serializer):
"""加入题单序列化器""" """加入题单序列化器"""

View File

@@ -283,12 +283,12 @@ class UserBadgeAPI(AsyncAPIView):
# 获取指定用户的徽章 # 获取指定用户的徽章
try: try:
target_user = await User.objects.aget(username=username, is_disabled=False) 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: except User.DoesNotExist:
return self.error("用户不存在") return self.error("用户不存在")
else: 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] badge_list = [badge async for badge in badges]
return self.success(await self.async_serialize_data(UserBadgeSerializer, badge_list, many=True)) return self.success(await self.async_serialize_data(UserBadgeSerializer, badge_list, many=True))