Пользовательский фильтр 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]