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)
使用与上述相同的方法,我想使用过滤器根据非用户名的字符串查询,并将该字符串传递给序列化程序。并将其用作嵌套序列化器中的过滤器。
谢谢
答案 0 :(得分:0)
您可以使用DjangoFilterBackend
来过滤模型的字段。
您可以按照以下步骤进行操作
将Django过滤器安装到Django应用程序中。
pip install django-filter
将默认的过滤器后端添加到您的settings.py
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
输入要应用过滤器的视图/视图集的filter_backends
属性。
from django_filters.rest_framework import DjangoFilterBackend
class PurchaseList(generics.ListAPIView):
...
filter_backends = (DjangoFilterBackend,)
将模型上的字段列表添加到视图/视图集的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