【问题标题】:How to filter through the list/retrieve function on Model ViewSet如何通过模型视图集上的列表/检索功能进行过滤
【发布时间】:2020-08-29 16:14:43
【问题描述】:

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

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

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

view.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)

【问题讨论】:

  • 您是否在设置中设置了任何过滤器后端?您是如何准确调用 API 来过滤/搜索结果的?
  • 是的,我按照 DRF 文档中的说明做了...通过如上所示的 url 是相同的但不返回对象,url 更改但不起作用

标签: python django django-rest-framework django-views django-filter


【解决方案1】:

您设置了一个过滤器后端,但随后您覆盖了调用它的代码(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+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2012-05-28
    • 2020-07-26
    相关资源
    最近更新 更多