【发布时间】:2017-10-09 21:58:18
【问题描述】:
我有一个 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)
当我在 url 中使用以下参数搜索租金时,我会得到所有租金,相反,我应该只获得位于加德满都市的租金并放置 koteshwor
http://localhost:8000/api/v1/rents?city=Kathmandu&place=Koteshwor
【问题讨论】:
-
既然这个视图的目的似乎是返回一个对象列表,为什么不直接使用
ListAPIView? -
我已经发布,更新,删除此视图上的所有内容,并显示单个租金或所有租金已通过单个 get 函数完成,而不是使用 ListAPIView 和 RetrieveAPIView
-
所以您已经复制了 DRF 视图集的功能。
-
我相信过滤器只适用于
ViewSets。由于您使用APIView手动编写所有内容,因此您必须手动实现过滤。顺便说一句,当您手动生成QuerySet并返回 JSON 响应时,您认为DjangoFilterBackend会做什么以及它如何为您神奇地填充过滤器?你需要仔细阅读 DRF 文档,他们有一个很好的教程,解释了每一个细微差别。 -
@EugeneMorozov,文档显示过滤器使用
ListAPIView,正如操作所说。 django-rest-framework.org/api-guide/filtering/…
标签: python django django-rest-framework django-filter