如何用Django Rest Framework的ModelViewSet获取活跃所有者的活跃商品?
解决DRF ModelViewSet仅展示活跃所有者的活跃商品问题
问题原因
你注释的代码返回的是Python列表,而非Django的QuerySet对象。DRF的ModelViewSet在执行retrieve(通过PK获取单个商品)操作时,依赖QuerySet的get()方法定位资源,列表没有该方法,因此无法通过PK找到对应商品。
正确实现方式
直接使用Django ORM的关联过滤,同时筛选商品活跃和所有者活跃的条件,返回QuerySet即可。这样既满足需求,又能让DRF正常处理所有内置视图动作(列表、详情、搜索、排序):
class ProductViewSet(viewsets.ModelViewSet): serializer_class = ProductSerializer parser_classes = (MultiPartParser, FormParser) search_fields = ['title', 'description'] ordering_fields = ['price', 'last_update'] permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsVendorOrReadOnly, IsOwnerOrReadOnly] def get_queryset(self): # 同时过滤活跃商品和活跃所有者 return Product.objects.filter(is_active=True, owner__is_active=True) def perform_create(self, serializer): serializer.save(owner=self.request.user)
说明
- 使用
owner__is_active=True通过外键关联筛选所有者状态,这是Django ORM的跨表查询语法,比Python循环遍历所有商品更高效,尤其适合数据量大的场景。 - 返回的
QuerySet支持DRF的搜索、排序等功能,不会影响原有视图的其他特性。
内容的提问来源于stack exchange,提问作者bielciTech
相关产品推荐
相关产品推荐

