我在 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
获取搜索、排序和过滤对象?
由于您想使用
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]