Django Rest Framework - 如果未发送则默认过滤器
Django Rest Framework - Default filter if not sent
我有一个 属性 模型,它有很多字段,但我对 is_shared
一个感兴趣
class Property(models.Model):
....
is_shared = models.BooleanField(blank=True, null=True)
我还有一个非常标准的开箱即用的视图集、序列化器和这个模型的过滤器。
我希望我的过滤器正常工作,因此如果未发送 is_shared
查询参数,它将 return 具有 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}
}
我还在 ViewSet 中的 filter_queryset
方法之前更新了请求以欺骗过滤器,但无论如何都不会调用它:
request.data.update({"is_shared": self.request.GET.get('is_shared')})
如果未发送 is_shared
查询参数,我如何实现,我将其视为 false
?
我认为您需要更新 request.GET
而不是 request.data
。
唯一阻止你这样做的是 request.GET
是一个不可变的 QueryDict
对象。
这个 hack 应该有效,但我不确定它是否会导致任何意外后果:
request.GET._mutable = True
request.GET.update({'is_shared': request.GET.get('is_shared', False)})
我有一个 属性 模型,它有很多字段,但我对 is_shared
一个感兴趣
class Property(models.Model):
....
is_shared = models.BooleanField(blank=True, null=True)
我还有一个非常标准的开箱即用的视图集、序列化器和这个模型的过滤器。
我希望我的过滤器正常工作,因此如果未发送 is_shared
查询参数,它将 return 具有 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}
}
我还在 ViewSet 中的 filter_queryset
方法之前更新了请求以欺骗过滤器,但无论如何都不会调用它:
request.data.update({"is_shared": self.request.GET.get('is_shared')})
如果未发送 is_shared
查询参数,我如何实现,我将其视为 false
?
我认为您需要更新 request.GET
而不是 request.data
。
唯一阻止你这样做的是 request.GET
是一个不可变的 QueryDict
对象。
这个 hack 应该有效,但我不确定它是否会导致任何意外后果:
request.GET._mutable = True
request.GET.update({'is_shared': request.GET.get('is_shared', False)})