如何在Django Rest Framework中过滤嵌套的序列化器?

在Django Rest Framework中,当一个序列化器嵌套在另一个序列化器中时,如何过滤它?

我的过滤器被强加在DRF视图集中,但是当您从另一个序列化器内部调用序列化器时,嵌套序列化器的视图集将永远不会被调用,因此嵌套结果看起来是未经过滤的。

我尝试在原始视图集上添加过滤器,但是它似乎无法过滤嵌套结果,因为嵌套结果被称为单独的预提取查询。(您看到嵌套的序列化程序是反向查找。)

是否可以在嵌套序列化程序本身中添加get_queryset()覆盖(将其移出视图集),以在其中添加过滤器?我也尝试过,没有运气。

这是我尝试过的方法,但似乎没有被调用:

class QuestionnaireSerializer(serializers.ModelSerializer):
edition = EditionSerializer(read_only=True)
company = serializers.StringRelatedField(read_only=True)

class Meta:
    model = Questionnaire

def get_queryset(self):
    query = super(QuestionnaireSerializer, self).get_queryset(instance)
    if not self.request.user.is_staff:
        query = query.filter(user=self.request.user, edition__hide=False)
    return query


你可以子类化ListSerializer并覆盖该to_representation方法。

默认情况下,该to_representation方法调用data.all()嵌套的查询集。因此,你实际上需要data = data.filter(**your_filters)在调用该方法之前进行制作。然后,你需要将子类化的ListSerializer添加为嵌套序列化器的meta上的list_serializer_class

  1. 子类ListSerializer,覆盖to_representation,然后调用super
  2. 将子类ListSerializer添加为list_serializer_class嵌套Serializer上的meta
    这是你的示例的相关代码。
class FilteredListSerializer(serializers.ListSerializer):

    def to_representation(self, data):
        data = data.filter(user=self.request.user, edition__hide=False)
        return super(FilteredListSerializer, self).to_representation(data)


class EditionSerializer(serializers.ModelSerializer):

    class Meta:
        list_serializer_class = FilteredListSerializer
        model = Edition


class QuestionnaireSerializer(serializers.ModelSerializer):
    edition = EditionSerializer(read_only=True)
    company = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = Questionnaire
转载:http://codingdict.com/questions/4908
posted @   catgatp  阅读(1219)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
历史上的今天:
2018-05-27 js原型链继承及调用父类方法
点击右上角即可分享
微信分享提示