You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework收藏接口未返回Show字段问题求助

问题:Favorite ViewSet返回结果缺少show字段

开发用户收藏演出功能时,User和Show的ViewSet运行正常,但存储用户与演出关联关系的Favorite ViewSet返回结果仅包含id和user字段,show字段缺失。数据库中关联数据实际存在,可通过ORM正常查询到关联的show和user,曾尝试排除Show序列化器中的user字段解决循环引用,但问题未解决。

当前收藏接口返回结果:

[
   {
      "id":2,
      "user":{
         "username":"poduck",
         "first_name":"",
         "last_name":"",
         "email":"poduck@gmail.com",
         "image":null,
         "url":"http://0.0.0.0:8000/api/users/poduck/?format=json"
      }
   }
]

解决方案

1. 修复FavoriteViewSet的查询集与模型导入

原代码中FavoriteViewSet的queryset错误指向了Show.objects.all(),且未导入Favorite模型,导致返回的是演出数据而非收藏关联数据。

修改后的shows.api.viewsets:

from car_show_helper.shows.models import Show, Favorite  # 新增Favorite模型导入
from .serializers import ShowSerializer, FavoriteSerializer
from rest_framework import viewsets


class ShowViewSet(viewsets.ModelViewSet):
    queryset = Show.objects.all()
    serializer_class = ShowSerializer


class FavoriteViewSet(viewsets.ModelViewSet):
    queryset = Favorite.objects.all()  # 改为查询Favorite模型数据
    serializer_class = FavoriteSerializer

2. 修正FavoriteSerializer的show字段配置

Favorite模型中show是ForeignKey(一对一关联),但原序列化器错误添加了many=True参数,导致DRF尝试将单个show实例当作集合处理,最终无法序列化显示。

修改后的shows.api.serializers:

from rest_framework import serializers
from shows.models import Show, Favorite
from users.api.serializers import UserSerializer


class ShowSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = Show
        fields = '__all__'


class FavoriteSerializer(serializers.ModelSerializer):
    show = ShowSerializer(read_only=True)  # 移除many=True参数
    user = UserSerializer()

    class Meta:
        model = Favorite
        fields = '__all__'

3. 可选:处理潜在循环引用(若仍有问题)

如果UserSerializer中也嵌套了ShowSerializer或FavoriteSerializer,会引发循环序列化问题。此时可以:

  • 将嵌套序列化改为主键引用:user = serializers.PrimaryKeyRelatedField(read_only=True)
  • 或在序列化器中指定仅返回必要字段:
    class ShowSerializer(serializers.ModelSerializer):
        user = UserSerializer(fields=['username', 'email'])  # 只返回需要的字段
        
        class Meta:
            model = Show
            fields = '__all__'
    

内容的提问来源于stack exchange,提问作者PoDuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:05:25