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)})