FilterSet для поля JSONField в DRF ListAPIView с использованием django_filters всегда возвращает один и тот же результат - PullRequest
1 голос
/ 06 июля 2019

Я хочу сделать запрос API в Django Restframework, как http://localhost:8000/apis/services/?page=1&name=2

Модель

from django.contrib.postgres.fields import JSONField

class Service(models.Model):
   name = JSONField(default=dict)

APIView

class DashboardServicesAPIView(ListAPIView):
    queryset = Service.objects.none()
    serializer_class = ServiceSerializer
    permission_classes = (AllowAny,)
    filter_class = ServiceFilter

    def get_queryset(self):
        return Service.objects.filter(vendor__company=self.request.user.userprofile.company)

FilterSet

class ServiceFilter(django_filters.rest_framework.FilterSet):
    name = django_filters.CharFilter(field_name="name", 
lookup_expr='icontains') 
    class Meta:
        model = Service
        fields = [ "name"]

Внутренний фильтр в settings.py

REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
.
.
.

Запросы с фильтромне работает тот же результат всегда возвращается.Любая помощь в том, что я пропустил, имея дело с JSON?

1 Ответ

1 голос
/ 06 июля 2019

Вам необходимо добавить filter_backends для интеграции django_filter с drf

class DashboardServicesAPIView(ListAPIView):
    queryset = Service.objects.none()
    serializer_class = ServiceSerializer
    permission_classes = (AllowAny,)
    filter_class = ServiceFilter

    filter_backends = (filters.DjangoFilterBackend,) 

    def get_queryset(self):
        return Service.objects.filter(vendor__company=self.request.user.userprofile.company)

https://django -filter.readthedocs.io / en / master / guide / rest_framework.html

Библиотека django-filter включает класс DjangoFilterBackend, который поддерживает настраиваемую фильтрацию полей для инфраструктуры REST.

...