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