Ser*_*ity 4 python django django-filter django-rest-framework
我有一个APIView类显示所有的租金和发布和删除等.现在我想要搜索功能,所以我试图使用DjangoFilterBackend但它不工作.我在文档中看到它已经与ListAPIView一起使用但是我如何在APIView中使用它.
class Rent(APIView):
"""
List all the rents if token is not provided else a token specific rent
"""
serializer_class = RentSerializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('city', 'place', 'property_category',)
search_fields = ('=city', '=place')
def get(self, request, token=None, format=None):
reply={}
try:
rents = Rental.objects.all()
if token:
rent = Rental.objects.get(token=token)
reply['data'] = self.serializer_class(rent).data
else:
reply['data'] = self.serializer_class(rents, many=True).data
except Rental.DoesNotExist:
return error.RequestedResourceNotFound().as_response()
except:
return error.UnknownError().as_response()
else:
return Response(reply, status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)
当我在网址中使用以下参数搜索租金时,我得到所有的租金,而我应该只获得位于加德满都市的租金并放置koteshwor
Chi*_*idG 11
要使用DjangoFilterBackend的功能,您可以合并filter_queryset方法GenericViewSet,这是从DRF继承APIView并导致DRF 中所有特定"通用"视图类的DRF类.它看起来像这样:
def filter_queryset(self, queryset):
"""
Given a queryset, filter it with whichever filter backend is in use.
You are unlikely to want to override this method, although you may need
to call it either from a list view, or from a custom `get_object`
method if you want to apply the configured filtering backend to the
default queryset.
"""
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
Run Code Online (Sandbox Code Playgroud)
https://github.com/encode/django-rest-framework/blob/master/rest_framework/generics.py
这里如果你正在使用APIView,与过滤器无关。所以你必须像
get_data = request.query_params #or request.GET check both
Run Code Online (Sandbox Code Playgroud)
然后
Rental.objects.filter(city=get_data['city'], place=get_data['place'])
Run Code Online (Sandbox Code Playgroud)
如果有人想知道我们如何django_filters filter_class与 api_views集成:
@api_view(['GET'])
@permission_classes([permissions.IsAuthenticated])
def filter_data(request, format=None):
qs = models.YourModal.objects.all()
filtered_data = filters.YourFilter(request.GET, queryset=qs)
filtered_qs = filtered_data.qs
....
return response.Ok(yourData)
Run Code Online (Sandbox Code Playgroud)