매개 변수별로 유연한 정렬과 매개 변수 필터링을 모두 수행해야하는 뷰셋이 있는데 이는 사용자 지정 list()
오버 라이드입니다. django-filter
을 통해 다양한 매개 변수를 필터링하고 작동하도록 명령을받을 수는 있지만 동시에 둘 다 작동하도록 할 수는 없습니다.Django Rest Framework : OrderingFilter와 django-filter를 동시에 사용하는 문제
class AssetViewSet(viewsets.GenericViewSet, AssetPaginationMixin,):
queryset = Asset.objects.all()
pagination_class = AssetPagination
serializer_class = serializers.AssetSerializer
filter_backends = (OrderingFilter,)
ordering_fields = ('id', 'session_id')
filter_class = AssetFilterSet
def list(self, request):
assets = AssetFilterSet(request.query_params)
serializer = self.get_serializer(assets, many=True)
return Response(serializer.data)
그리고 마지막으로, 내 filters.py
코드 : 필터링 작동 코드 여기
class AssetViewSet(viewsets.GenericViewSet, AssetPaginationMixin,):
queryset = Asset.objects.all()
pagination_class = AssetPagination
serializer_class = serializers.AssetSerializer
filter_backends = (OrderingFilter,)
ordering_fields = ('id', 'session_id')
filter_class = AssetFilterSet
def list(self, request):
assets = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(assets, many=True)
return Response(serializer.data)
그리고있다 :
여기에 결과를 주문 작동 내 간단한 views.py
코드
class AssetFilterSet(django_filters.FilterSet):
project_id = django_filters.NumberFilter()
submitted = django_filters.TypedChoiceFilter(choices=BOOLEAN_CHOICES, coerce=strtobool)
class Meta:
model = Asset
fields = ['project',
'submitted']
유일한 차이점은 첫 번째 l in . 웬일인지 filter_class = AssetFilterSet
으로 지정되어 있음에도 불구하고 에 self.filter_queryset
을 사용하면 AssetFilterSet
을 적용해야 효과가 나타나기 때문에 list()
내에 직접 적용해야합니다.
모델을 사용하고 있기 때문에'viewset.ListViewSet' 또는'viewset.ModelViewSet'의 하위 클래스를 만들면 왜 상속 될 것이므로'list'를 제공 할 필요가 없습니다. –