【问题标题】:Django Rest Framework - Default filter if not sentDjango Rest Framework - 如果未发送默认过滤器
【发布时间】: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


【解决方案1】:

我认为您需要更新 request.GET 而不是 request.data。 唯一阻止你这样做的是request.GET 是一个不可变的QueryDict 对象。

这个 hack 应该可以工作,但我不确定它是否会导致任何意想不到的后果:

request.GET._mutable = True
request.GET.update({'is_shared': request.GET.get('is_shared', False)})

【讨论】:

  • 成功了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-03-19
  • 2019-04-21
  • 2019-02-12
  • 2015-06-10
  • 2016-03-31
  • 2021-06-25
  • 2013-05-21
  • 2010-10-25
相关资源
最近更新 更多