zoukankan      html  css  js  c++  java
  • 如何在Django Rest Framework中过滤嵌套的序列化器?

    如何在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

    如何在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
  • 相关阅读:
    PHP定时备份MySQL,mysqldump语法大全
    虚拟机拷贝之后,发现系统内的开机自启动的nginx,不能自启动了
    八:二叉搜索树的后序遍历
    配置Ubuntu开发环境
    poj 1147 Binary codes
    test
    Python标准库:内置函数reversed(seq)
    Matplotlib 工具包 使用教程索引
    6大设计原则(1):单一职责原则
    hdu 4104
  • 原文地址:https://www.cnblogs.com/ltyc/p/15718249.html
Copyright © 2011-2022 走看看