Возврат пустой страницы при отсутствии фильтрации в 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 по другой причине, это может привести к неожиданному поведению.