Фильтрация по декоратору действий - Django Rest Framework - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь отфильтровать данные с помощью действия декоратора в Django Rest Framework, оно отлично работает, если я использую глобальный набор запросов (функция get_queryset ()), но мне нужно использовать его в отдельной функции.

Я использую django-фильтр для его выполнения. Это код.

Мой взгляд:

class ShippingAPI(viewsets.ModelViewSet):
    serializer_class = ShippingSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('origin__department', 'destination__department', 'first_collection_date', 'last_collection_date', 'vehicle')

Переопределение (действие)

@action(detail=False, methods=['GET'])
def filter_shippings(self, request, **kwargs):
    queryset = Shipping.objects.filter(status=2, orderStatus=0)
    serializer = SearchShippingSerializer(queryset, many=True) #Yes, I am using another serializer, but it is solved,I use diferent if it is necesary
    return Response(serializer.data)

После использования моего URL 'api / filter_shipping / (все фильтры здесь)', он по-прежнему возвращает все данные без фильтров, которые я запрашиваю.

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вы можете переопределить обычный метод get_queryset из представления и проверить self.action

class ShippingAPI(viewsets.ModelViewSet):
    queryset = Shipping.objects.all()
    serializer_class = ShippingSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('origin__department', 'destination__department', 'first_collection_date', 'last_collection_date', 'vehicle')

    def get_queryset(self):
        queryset = super().get_queryset()

        if self.action == 'filter_shippings':
            queryset = queryset.filter(status=2, orderStatus=0)
        elif self.action == 'other_action':
            queryset = queryset.filter(...)  # other action filter

        return queryset
0 голосов
/ 15 марта 2019

Добавьте функцию filter_queryset следующим образом. Это сработало для меня. Нашел решение в Django-фильтрах: https://github.com/carltongibson/django-filter/issues/967.

@action(detail=False, methods=['GET'])
def filter_shippings(self, request, **kwargs):
    queryset = self.filter_queryset(self.get_queryset()).filter(status=2, orderStatus=0)
    serializer = SearchShippingSerializer(queryset, many=True) #Yes, I am using another serializer, but it is solved,I use diferent if it is necesary
    return Response(serializer.data)
0 голосов
/ 19 ноября 2018

Вы можете отфильтровать результат get_queryset, чтобы ограничить результаты.

@action(detail=False, methods=['GET'])
def filter_shippings(self, request, **kwargs):
    queryset = self.get_queryset().filter(status=2, orderStatus=0)
    serializer = SearchShippingSerializer(queryset, many=True) #Yes, I am using another serializer, but it is solved,I use diferent if it is necesary
    return Response(serializer.data)

Edit: Вы можете создать собственный фильтр и выполнять фильтрацию по мере необходимости. Вот пример из документации django-фильтра.

import django_filters

class ProductFilter(django_filters.FilterSet):
    class Meta:
        model = Product
        fields = ['name', 'price', 'manufacturer']

def product_list(request):
    filter = ProductFilter(request.GET, queryset=Product.objects.all())
    return render(request, 'my_app/template.html', {'filter': filter})
...