Django Rest Framework - Фильтр по умолчанию, если не отправлен

У меня есть модель Property, которая имеет много полей, но меня интересует is_shared одно

class Property(models.Model):
    ....
    is_shared = models.BooleanField(blank=True, null=True)

У меня также есть довольно стандартный, из коробки, viewset, сериализатор и фильтр для этой модели.

Я хочу, чтобы мой фильтр работал так, что если параметр запроса is_shared НЕ отправлен, он будет возвращать свойства с is_shared=False

Для этого у меня есть следующий метод фильтрации:

class PropertyFilter(dj_filters.FilterSet):
    is_shared = dj_filters.BooleanFilter(method='filter_by_is_shared')

    @staticmethod
    def filter_by_is_shared(queryset, name, value):
        return queryset if value else queryset.filter(is_shared=False)

Это хорошо работает, если в запросе отправлены True или False, но если is_shared вообще не отправлено, это не сработает.

Я пробовал добавить это в сериализатор, но безуспешно.

class PropertySerializer(serializers.ModelSerializer):

    class Meta:
        model = Property
        fields = ['is_shared']
        extra_kwargs = {
            'is_shared': {'default': False}
        }

Как добиться того, чтобы если параметр запроса is_shared не отправлен, то он обрабатывался как false?

Я думаю, что вам нужно обновить request.GET вместо request.data. Единственное, что мешает вам это сделать, это то, что request.GET является объектом QueryDict, который неизменяем.

Этот хак должен работать, но я не уверен, что он может вызвать какие-либо неожиданные последствия:

request.GET._mutable = True
request.GET.update({'is_shared': request.GET.get('is_shared', False)})
Вернуться на верх