Я применил набор фильтров в drf.я не знаю, почему все данные возвращаются, когда я запрашиваю с полем не в наборе фильтров - PullRequest
0 голосов
/ 29 марта 2019

Я не знаю, почему возвращаются все данные, когда я запрашиваю поле, отсутствующее в классе 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, работает очень хорошо, но /temp/?sha1=XXXX, возвращает все данные .

Я думаю, что если в запросе не указаны поля, возвращается не найденным.

Я пытаюсь определить исключение в классе FilterSet, но оно все еще не работает. Как я решу эту проблему?

1 Ответ

0 голосов
/ 29 марта 2019

Я обнаружил в документации по django-фильтрам , что вы можете переопределить свойство 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

Таким образом, приведенный выше код вернул бы пустой набор запросов, если какой-либо из параметров запроса не существовал.

...