Пользовательский фильтр Django Rest Framework с фильтром поиска и упорядочивания по умолчанию

У меня есть проект на Django Rest Framework, где мне нужно иметь конечную точку, где я могу искать объекты Document по названию и тексту, а также возможность искать активные и неактивные объекты, используя для этого URL-адрес. Для этого я использую пакет Django_filters. Пример: https://localhost:8000/?is_active=True.

Это моя модель

class Document(models.Model):
    title = models.CharField(max_length=100)
    text = models.TextField()
    date = models.DateField()
    account = models.ForeignKey(
        to=Account,
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name='documents',
        verbose_name='account',
        help_text='account',
    )
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.title

Serializer

class DocumentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Document
        fields = ['id', 'title', 'text', 'date', 'account', 'is_active']

Пользовательский набор фильтров

class DocumentBackendFilter(dfilters.FilterSet):
    is_active = dfilters.BooleanFilter(field_name='is_active', lookup_expr='exact')

    class Meta:
        model = Document
        fields = ['is_active']

View

class DocumentsListView(viewsets.ModelViewSet):
    queryset = Document.objects.all()
    serializer_class = DocumentSerializer
    filterset_class = DocumentBackendFilter
    filterset_fields = ('is_active',)

    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['title', 'text']
    ordering_fields = ['title', 'text']

    def get_queryset(self):
        qs = super().get_queryset()
        qs = qs.filter(account__users=self.request.user)
        return qs

Проблема:

Под url: http://127.0.0.1:8000/?is_active=True У меня есть элементы, где is_active установлен на True и False. Поиск по умолчанию работает нормально. Как я могу получить объекты поиска, упорядочивания и фильтрации, основанные на is_active?

Поскольку вы хотите использовать DocumentBackendFilter, вы должны добавить DjangoFilterBackend из django_filters.rest_framework в список filter_backends в вашем классе представления. Кроме того, если вы установите filterset_class, класс представления будет игнорировать список значений filterset_fields, поэтому вы должны предоставить одно из них.

class DocumentsListView(viewsets.ModelViewSet):
    # some code
    filterset_class = DocumentBackendFilter
    # filterset_fields = ('is_active',) -> remove this line

    filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
Вернуться на верх