feat(problemset): 用户奖章接口带出所属题单
成就页的奖章列表只有奖章本身,看不出来自哪个题单。UserBadgeSerializer
补一个 problemset 字段,查询改 select_related("badge__problemset") —— 这是
异步视图,不预加载会在异步上下文里发同步查询。
This commit is contained in:
@@ -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):
|
||||||
"""加入题单序列化器"""
|
"""加入题单序列化器"""
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user