【发布时间】:2022-01-25 12:47:11
【问题描述】:
我有一个属性模型,它有很多字段,但我对is_shared 感兴趣
class Property(models.Model):
....
is_shared = models.BooleanField(blank=True, null=True)
我也有一个非常标准的、开箱即用的视图集、序列化器和这个模型的过滤器。
我希望我的过滤器能够正常工作,因此如果未发送 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}
}
我还更新了 ViewSet 中 filter_queryset 方法之前的请求以欺骗过滤器,但它无论如何都不会被调用:
request.data.update({"is_shared": self.request.GET.get('is_shared')})
如果没有发送is_shared查询参数,我怎么做到的,我把它当作false处理?
【问题讨论】:
-
您可以覆盖序列化程序的
to_internal_value方法并检查传入的有效负载是否包含is_shared。
标签: django django-rest-framework django-filter