使用URL中的字段在Django Rest Framework中的ListAPIView中进行过滤

时间:2019-04-01 02:49:36

标签: python django django-rest-framework

Iam使用Django Restframework的通用ListApiView,使用的序列化程序iam由许多其他序列化程序(嵌套的序列化程序)组成。我需要知道如何使用URL中的关键字并将其传递给序列化程序,以便我可以使用URL中的关键字过滤结果。

例如,我有一个api视图

class GetList(Generics.ListApiView):
    serializer Class = ABCSerializer

我想从URL传递一个值,以过滤序列化程序产生的结果的某些部分。此ABCSerializer由许多其他嵌套的序列化器组成。我想使用URL中的值而不是主键来过滤结果。

在下面的示例中,它显示了基于URL中用户名的过滤器。

url('^purchases/(?P<username>.+)/$', PurchaseList.as_view()),

我们可以编写一个视图,该视图返回按URL的用户名部分过滤的购买查询集:

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        username = self.kwargs['username']
        return Purchase.objects.filter(purchaser__username=username)

使用与上述相同的方法,我想使用过滤器根据非用户名的字符串查询,并将该字符串传递给序列化程序。并将其用作嵌套序列化器中的过滤器。

谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用DjangoFilterBackend来过滤模型的字段。

您可以按照以下步骤进行操作

  1. 将Django过滤器安装到Django应用程序中。

    pip install django-filter
    

    将默认的过滤器后端添加到您的settings.py

    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
    }
    
  2. 输入要应用过滤器的视图/视图集的filter_backends属性。

    from django_filters.rest_framework import DjangoFilterBackend
    
    class PurchaseList(generics.ListAPIView):
        ...
        filter_backends = (DjangoFilterBackend,)
    
  3. 将模型上的字段列表添加到视图/视图集的filterset_fields属性中,以将过滤器应用于这些字段。

    class PurchaseList(generics.ListAPIView):
        queryset = Purchase.objects.all()
        serializer_class = PurchaseSerializer
        filter_backends = (DjangoFilterBackend,)
        filterset_fields = ('category', 'other_field')
    

    我希望这可以帮助您过滤ListAPIViews。

有关更多详细信息,请访问API Guide on Django filter

要使用高级过滤器,请访问软件包django-rest-framework-filters