当前位置: 首页 > 面试题库 >

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

伯博
2023-03-14
问题内容

在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


 类似资料:
  • 问题内容: 这是我的表(简体,仅重要的列): 以及一些样本数据: 我想选择键下任意位置的行。像这样的东西: 数据完全像样本中一样嵌套(仅一层)。 当前,我们正在使用PostgreSQL 9.3.5。 在PostgreSQL 9.3中可以吗?也许是9.4? 问题答案: 您的查询已关闭。 是关键功能。还是为了。进行了一些改进: 旧的sqlfiddle db <> fiddle在这里 已经返回该值作为数

  • 考虑: 如果我们序列化Foo(),输出是: 我想要: 最干净的方法是什么?

  • 我有一个映射: 我使用三个条件进行筛选: “日志类型”是“爬虫” “2020-05-23”上的“创建数据” “resp”的大小=0 我试图过滤与查询: {"查询":{"bool":{"必须":[{"术语":{"_logType":{"value":"爬虫"}}},{"范围":{"_createdAt":{"gte":"2020-05-23","lte":"2020-05-23","time_zon

  • 问题内容: 有一个简单的POJO- 内部带有子类别。嵌套可能会很深,因为每个子类别都可能包含子子类别,依此类推。我想通过jersey 返回为REST资源,序列化为json(由jackson提出)。问题是,我不能真正限制序列化的深度,因此所有类别树都可以序列化。 有没有办法在完成第一级(即具有其第一级子类别)后立即停止对杰克逊进行序列化的对象? 问题答案: 如果可以从POJO中获取当前深度,则可以使

  • 问题内容: 我正在尝试过滤存储桶中的嵌套聚合。 对应: 索引数据: 我正在使用此查询和聚合定义 我从聚合结果中得到的是: 我在筛选存储桶列表时遇到了麻烦,因为它们只能提供所提供的事件ID,因此结果应类似于: 问题答案: 您快到了,只需要在聚合中添加过滤器即可,如下所示: 原因是您的查询将正确选择具有指定事件ID的嵌套事件的所有文档,但是,汇总将对所有选定文档中的所有嵌套事件进行处理。因此,您还需要