Возврат пустой страницы при отсутствии фильтрации в DRF и Django Filters

У меня есть ViewSet, как показано ниже:

class EntryViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer
    filter_backends = [DjangoFilterBackend, OrderingFilter]
    filterset_class = EntryFilterSet
    ordering_fields = ["created_at", "last_update"]
    ordering = "created_at"

...и FilterSet, определяющий несколько полей, по которым я могу фильтровать:

class EntryFilterSet(django_filters.FilterSet):
    class Meta:
        model = models.Entry
        fields = [
            "content",
            # and other fields
        ]

Я подключил свой EntryViewSet к /api/entries/ с помощью DefaultRouter DRF, представление списка автоматически называется api:entry-list.

Итак, /api/entries/ возвращается:

... и фильтрация тоже работает. Однако это не то поведение, которое я хотел бы получить. Я хочу, чтобы эта конечная точка возвращала пустую страницу, если нет фильтрации. Как показано ниже:

{
  "count": 0,
  "next": "http://localhost:8000/api/entries/?format=json&p=2",
  "previous": null,
  "results": []
}

Как я могу добиться такого поведения?


Environment

  • django ^2.2
  • djangorestframework ^3.12.4
  • django-filter ^21.1

Поскольку фильтрация работает на параметрах URL, вы можете проверить их. Если они пусты, вы можете вернуть пустой набор запросов.

Вы можете добиться такого поведения на get_queryset на ModelViewSet. Просто переопределите метод, как показано ниже:

    def get_queryset(self):
        if not bool(self.request.GET):
            return Entry.objects.none()

        return Entry.objects.all()

Помните, что при этом проверяется, пустые ли URL-параметры. Если вы используете параметры URL по другой причине, это может привести к неожиданному поведению.

Вернуться на верх