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