Как унаследовать общую фильтрацию в дополнительном действии
Я хочу наследовать Generic Filtering include (filterset_fields
, search_fields
, ordering_fields
в дополнительном действии sold
. Как это сделать, и какой способ лучше для этого случая? Спасибо за любой совет для меня!
class ApartmentViewset(viewsets.ModelViewSet):
queryset = Apartment.objects.all().order_by('-timestamp')
serializer_class = ApartmentSerializer
# Set permission for only user owner apartment can edit it.
permission_classes = [
permissions.IsAuthenticatedOrReadOnly, IsOwnerApartmentOrReadOnly]
# Add search by address, filter by district and ordering by price
filter_backends = [filters.SearchFilter,
DjangoFilterBackend, filters.OrderingFilter]
filterset_fields = ['district']
search_fields = ['address', 'seller']
ordering_fields = (
'price',
)
# fill current username when create new apartment
def perform_create(self, serializer):
serializer.save(seller=self.request.user)
@action(detail=False)
def sold(self, request):
queryset = self.queryset.filter(issold=True)
serialize = self.serializer_class(queryset, many=True)
return Response(serialize.data)
Generic View (и, следовательно, все классы, которые наследуются от него) в DRF имеет метод filter_queryset
, который вызывается различными миксинами для выполнения фильтрации, поэтому вы можете просто вызвать его в своем методе. Если вам также нужна пагинация, существуют методы paginate_queryset
и get_paginated_response
:
class ApartmentViewset(viewsets.ModelViewSet):
...
@action(detail=False)
def sold(self, request):
queryset = self.filter_queryset(self.queryset.filter(issold=True))
serialize = self.serializer_class(queryset, many=True)
return Response(serialize.data)