Django Rest Framework 自定义过滤器,带有默认搜索和排序过滤器

问题描述 投票:0回答:1

我在 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

序列化器

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']

查看

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
获取搜索、排序和过滤对象?

python django django-rest-framework django-filter
1个回答
0
投票

由于您想使用

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]
© www.soinside.com 2019 - 2024. All rights reserved.