Django Rest:如何获取关联Director对象下的Product列表?
实现指定导演关联电影列表的解决方案
1. 修改序列化器(serializers.py)
在DirectorSerializer中添加反向关联的电影字段,利用Django外键的反向关联特性(默认名称为product_set),嵌套ProductSerializer返回完整的电影信息:
class ProductSerializer(serializers.ModelSerializer): director = serializers.StringRelatedField() class Meta: model = Product fields = '__all__' class DirectorSerializer(serializers.ModelSerializer): # 新增反向关联的电影列表字段 products = ProductSerializer(source='product_set', many=True, read_only=True) class Meta: model = Director fields = ['_id', 'firstname', 'lastname', 'products']
2. 添加单个导演详情视图(views.py)
新增视图用于根据导演ID获取其详情及执导的所有电影,同时用prefetch_related优化查询避免N+1问题:
@api_view(['GET']) def getSingleDirector(request, pk): director = Director.objects.prefetch_related('product_set').get(_id=pk) serializer = DirectorSerializer(director, many=False) return Response(serializer.data)
补充路由配置(urls.py)
在项目路由中添加对应接口路径:
path('directors/<str:pk>/', views.getSingleDirector, name='director-detail'),
3. 前端实现逻辑
点击导演名称时,发送GET请求到/api/directors/{导演ID}/,接口返回的响应数据中products字段即为该导演执导的所有电影列表,直接渲染该列表即可。
可选优化:获取所有导演时直接携带电影列表
如果希望前端加载所有导演时就拿到对应电影数据,修改现有getDirector视图:
@api_view(['GET']) def getDirector(request): directors = Director.objects.prefetch_related('product_set').all() serializer = DirectorSerializer(directors, many=True) return Response(serializer.data)
这样前端可直接从导演对象的products属性中读取电影列表,无需额外请求。
内容的提问来源于stack exchange,提问作者Naig
相关产品推荐
相关产品推荐

