我在drf中应用了filterset。我不查询filterset以外的字段时,为什么不返回所有数据

时间:2019-03-29 08:41:04

标签: django django-rest-framework

我不知道为什么查询不在FilterSet类中的字段时会返回所有数据

这是我的模特

class TempModel(models.Model):
    md5 = models.CharField()
    sha1 = models.CharField()

以下是我的filterSet类

class TempFilter(filters.FilterSet):

    class Meta:
        model = TempModel
        fields = ("md5")

最后这是我的ViewSet

class TempViewSet(viewsets.ModelViewSet):
    queryset = TempModel.objects.all()
    permission_classes = [IsAuthenticated]
    authentication_classes = [TokenAuthentication]
    serializer_class = TempSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = TempFilter

我提出请求时

/temp/?md5=XXXX,效果很好,但是{strong> /temp/?sha1=XXXX,它返回所有数据。

我认为如果未指定请求字段,则找不到返回的内容。

我尝试在FilterSet类中定义排除,但仍然无法正常工作,如何解决该问题?

1 个答案:

答案 0 :(得分:0)

我在the django-filters documentation中发现,您可以覆盖qs属性以过滤主查询集(在视图集中声明的queryset = TempModel.objects.all())。

class TempFilter(filters.FilterSet):

    class Meta:
        model = TempModel
        fields = ("md5")

    @property
    def qs(self):
        queryset = super(TempModel, self).qs
        query_params = self.request.query_params
        if any(query_param not in TempModel.Meta.fields for query_param in query_params):
            return queryset.none()

        return queryset

因此,如果没有任何查询参数,则上面的代码将返回空的查询集。