首页 > 解决方案 > 如何通过模型视图集上的列表/检索功能进行过滤

问题描述

任何人都知道如何在视图集的列表/检索功能上实现搜索过滤器?

我正在尝试在 ViewSet 上使用 DRF Searh-filter,但它不起作用(它不返回过滤的对象)。

我想返回的是类似 --> /store/1/locker/1/controller?controller={name_controller}

视图.py

class ControllerViewSet(viewsets.ModelViewSet):
    serializer_class = ControllerSerializer
    queryset = Controller.objects.all()
    filter_backends = [filters.SearchFilter]
    search_fields = ['controller']

    def list(self, request, store_pk=None, locker_pk=None):
        queryset = Controller.objects.filter(locker__store=store_pk, locker=locker_pk)
        serializer = ControllerSerializer(queryset, many=True, context={'request': request})
        return Response(serializer.data)

    def retrieve(self, request, pk=None, store_pk=None, locker_pk=None):
        queryset = Controller.objects.filter(pk=pk, locker=locker_pk, locker__store=store_pk)
        locker = get_object_or_404(queryset, pk=pk)
        serializer = ControllerSerializer(locker, context={'request': request})
        return Response(serializer.data)

标签: pythondjangodjango-rest-frameworkdjango-viewsdjango-filter

解决方案


您设置了一个过滤器后端,但随后您覆盖了将调用它的代码 ( list(), retrieve())。

似乎您覆盖这些方法的唯一原因是通过存储和储物柜 pks 过滤查询集。这可以在一个地方完成以影响所有请求,而不会破坏现有代码。

def get_queryset(self):
    locker_pk = self.kwargs["locker_pk"]  # named parameters in url appear in self.kwargs
    store_pk = self.kwargs["store_pk"]
    return super().get_queryset().filter(locker=locker_pk, locker__store=store_pk)

就是这样。DRF 将调用此方法来获取查询集,按照配置对其进行过滤,并使用您的序列化程序自动序列化数据。无需手动实现已经提供的内容。

注意:确保您的 pk 对正则表达式有效。如果有人请求,您不希望您的应用程序崩溃/store/x/locker/y/controller,对吗?正则表达式应该是\d+任何整数。


推荐阅读