Django Rest-framework中ModelViewSet设置lookup_field后如何返回多条对象
问题原因说明
lookup_field是DRF为详情查询接口(retrieve) 提供的配置项,作用是匹配单个模型实例的查询字段,天生设计为返回单条对象,因此你当前的配置无法实现返回某产品下所有关联评价的需求。
序列化器Meta中配置的lookup_field = "product"属于无效配置,可直接删除。
实现方案
你可以根据自己的使用习惯任选以下方案:
方案1:重写get_queryset实现列表过滤(简单直观,适合固定过滤规则)
修改视图类代码如下:
class RatingViewSet(viewsets.ModelViewSet): queryset = Rating.objects.all() serializer_class = RatingSerializer # 删掉原有lookup_field配置 def get_queryset(self): queryset = super().get_queryset() # 从请求查询参数中获取产品id product_id = self.request.query_params.get('product_id') if product_id: queryset = queryset.filter(product_id=product_id) return queryset
调用方式:请求GET /rating/?product_id=目标产品ID即可返回该产品下所有关联的Rating数据。
方案2:自定义action实现路径式查询(适合希望把产品ID放在URL路径中的场景)
修改视图类代码如下:
from rest_framework.decorators import action from rest_framework.response import Response class RatingViewSet(viewsets.ModelViewSet): queryset = Rating.objects.all() serializer_class = RatingSerializer @action(detail=False, methods=['get'], url_path=r'product/(?P<product_id>\d+)') def list_by_product(self, request, product_id=None): ratings = self.get_queryset().filter(product_id=product_id) serializer = self.get_serializer(ratings, many=True) return Response(serializer.data)
调用方式:请求GET /rating/product/目标产品ID/即可返回对应产品的所有评价列表。
方案3:使用DRF过滤组件(适合多条件过滤、后续有扩展过滤需求的场景)
- 先安装依赖:
pip install django-filter - 在项目settings.py中注册应用:
INSTALLED_APPS = [ # 原有其他应用 'django_filters', ]
- 修改视图类配置:
from django_filters.rest_framework import DjangoFilterBackend class RatingViewSet(viewsets.ModelViewSet): queryset = Rating.objects.all() serializer_class = RatingSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['product', 'user', 'ratingpoint'] # 可自行添加需要支持过滤的字段
调用方式:除了可以通过GET /rating/?product=目标产品ID查询指定产品的评价外,还支持多条件组合过滤,比如GET /rating/?product=1&ratingpoint=5即可查询产品ID为1的所有5星评价。
内容的提问来源于stack exchange,提问作者Chen Triều
相关产品推荐
相关产品推荐

