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

2023-11-29

在 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

您可以子类化列表序列化器并覆盖to_representation方法。

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

  1. 子类ListSerializer,覆盖to_representation然后调用超级
  2. 添加子类 ListSerializer 作为元list_serializer_class在嵌套序列化器上

这是您的示例的相关代码。

class FilteredListSerializer(serializers.ListSerializer):

    def to_representation(self, data):
        data = data.filter(user=self.context['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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Socket.io 不适用于 Firefox 和 Chrome

    我正在尝试开发一个简单的聊天应用程序 这是我的chat js file var app require http createServer handler io require socket io listen app fs require
  • 在 python 中使用 cairosvg 模块时可以指定缩放吗

    cairosvg 的命令行版本允许缩放 这是帮助函数的输出 cairosvg h usage cairosvg h v f pdf png ps svg d DPI W WIDTH H HEIGHT s SCALE u o OUTPUT i
  • Kafka Streams - 如何更好地控制内部创建的状态存储主题的分区?

    Kafka Streams 中的状态存储是在内部创建的 状态存储按键分区 但不允许提供除by key 据我所知 问题 How to 控制状态存储内部创建主题的分区数量 状态存储主题如何推断默认情况下要使用的分区数量和分区 以及如何覆盖 如果
  • OpenGL 计算着色器 SSBO

    我想要一个在输出缓冲区中写入 1 的计算着色器 我编译着色器并将其附加到程序中 没有问题 然后我调用glDispatchCompute 函数 我等到计算着色器结束 但当我看到数组时 只有 0 谁能告诉我错误在哪里 这是我的计算着色器代码 v
  • 是否无法从 BroadcastReceiver 启动活动

    我想从扩展 BroadcastReceiver 的类中调用此活动 但它不起作用 Intent i new Intent DevicePolicyManager ACTION SET NEW PASSWORD context startAct
  • OmniFaces 条件注释未写入 HTML 输出

    我正在使用 OmniFaces conditionalComment 加载 IE 6 浏览器的 javascript 文件 在网站上 它说脚本应该包含在页面中 如下所示 这不是有效的 xml 因此不能在 JSF xhtml 文件中使
  • 正则表达式从数字到数字匹配?

    有没有办法从一个数字到另一个数字进行正则表达式 我有这个曲目列表 01 Intro 02 Waage 03 Hy nen feat Samra 04 Ich will es bar feat Haftbefehl 05 Am Boden b
  • 使用 Apache 的不同 Php-Fpm 容器

    我的生产服务器正在运行具有经典结构的 Docker Db Container Server Container 和 Php Fpm 容器 我想做的是拆分源代码 以便为项目的 3 个主要部分提供不同的容器 现在 它们以旧的方式工作 例如用于主
  • j_security_check 连接中断

    我正在使用tomcat的身份验证 当我将登录页面打开大约半小时然后尝试登录时 出现以下错误 URL http localhost pc j security check 页面内容 连接中断 加载页面时重置了与服务器的连接 协商连接时网络链接
  • Unity从服务器下载视频并保存

    我想从我的服务器获取视频并将其保存在我的资源中 以便稍后在游戏中查看 我知道使用 www 但我不明白如何从我的服务器下载视频并给出它的网址 下面是获取视频作为纹理的代码 var www new WWW http Sameer com Sam
  • 如何在 select2 选择上启用悬停事件

    我正在使用 select2 内置事件不支持所选项目上的悬停事件 因此我尝试在鼠标悬停在该项目上时触发悬停事件 多项选择 function tagFormat state return span class tagElement state
  • SoundCloud API URL 超时,然后在大约 50% 的曲目上返回错误 403 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我注意到这个问题过去已经被报道过很多次了 但似乎 SoundCloud 支持团队中没有人真正能够解决这个问题 从本周开始 SoundCloud API URL 就会超时 再次
  • Java可以过滤脏话吗?

    我想知道是否可以过滤脏话 过滤脏话的一个例子是创建帐户时的用户名 这样它就可以通知用户该词是不可接受的 是否可以 谢谢 不 不可能使用任何编程语言来过滤不良语言单词 您能做的最好的事情就是创建一个不良语言单词列表 然后对照该列表进行检查 只
  • 如果条件为假,则将单元格留空

    其他问题也涉及到这一点 并提供了对于非常大的数据集不可行的解决方案 我有一个跨 9 列的公式 如下所示 IF A1 A2 B2 zz 然后 我自动填充大约 350 万个单元格 复制 gt 粘贴值 然后我找到 zz 并将其替换为 空单元格 然
  • a=a++ 在 java 中如何工作[重复]

    这个问题在这里已经有答案了 最近我发现了这段Java代码 int a 0 for int i 0 i lt 100 i a a System out println a a 的打印值是 0 但是在 C 的情况下 a 的值是 100 我无法理
  • 使用 TitanDB 进行 UPSERT

    我正在迈出作为 TitanDB 用户的第一步 也就是说 我想知道如何进行更新插入 有条件地在一个顶点中插入一个顶点TitanTransaction 以 获取或创建 的风格 我在要创建 查找的顶点 属性上有一个唯一索引 下面是 Titan 1
  • Android:使图像不透明/透明

    问候 我想将图像放置在表面视图上 不过 我希望图像是透明的 这样您就可以看到图像以及不可见的表面视图 谁能建议我如何做到这一点 这就是我在绘制形状之前的做法 Bitmap buffer Bitmap createBitmap width h
  • Ruby / Rails 字符串数组插入 PostgreSQL

    目前 我有一个 Rails 项目 我正在尝试将活动记录直接传递到 postgres 以便使用字符串数组进行大批量创建 其中值尚不存在 以避免重复 我面临的问题是试图将 ruby 数组中包含 或 等的字符串字符转义为 postgres 可以接
  • git - 远程:致命:你在一个尚未诞生的分支上,使用 post-receive 钩子

    所以我试图将 github 分支同步到我网站的两个部分 理论上是我的 master 分支github应该与我的网站同步微小天气站 com并且 beta 分支应该与beta tinyweatherstation com 并且我已经成功地将 p
  • 如何在 Django Rest Framework 中过滤嵌套序列化器?

    在 Django Rest Framework 中 当序列化程序嵌套在另一个序列化程序中时 如何过滤它 我的过滤器强加在 DRF 视图集中 但是当您从另一个序列化器内部调用序列化器时 嵌套序列化器的视图集永远不会被调用 因此嵌套结果显示为未