如何动态更改 Django Rest Framework 嵌套序列化器的深度?

2024-01-26

我有一组嵌套序列化器,其中有一个depth设置在各自的Meta类。我想根据视图中传递的参数以编程方式更改深度。

class ResourceSerializer(serializers.ModelSerializer):
    type         = serializers.PrimaryKeyRelatedField(queryset=EntityType.objects.all())
    tags         = serializers.PrimaryKeyRelatedField(queryset=Tag.objects.all(), many=True)

    class Meta:
        model  = Resource
        fields = ('id', 'type', 'uri', 'tags', 'created_date')
        depth = 1

不幸的是,似乎没有办法覆盖depth运行时的属性。我当前的解决方案是继承“浅”序列化器并覆盖它们的 Meta 类来调整深度。

class ResourceNestedSerializer(ResourceSerializer):
    class Meta(ResourceSerializer.Meta):
        depth = 2

在我看来:

    if nested:
        serializer = ContainerNestedSerializer(containers, many=True)
    else:
        serializer = ContainerSerializer(containers, many=True)
    return Response(serializer.data)

有什么办法可以调整吗depth打电话之前serializer.data?


这是我的代码,其中包含包含/排除字段以及动态调整深度。根据你的口味调整它。 :)

class DynamicModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed, and takes in a "nested"
argument to return nested serializers
"""

def __init__(self, *args, **kwargs):
    fields = kwargs.pop("fields", None)
    exclude = kwargs.pop("exclude", None)
    nest = kwargs.pop("nest", None)

    if nest is not None:
        if nest == True:
            self.Meta.depth = 1

    super(DynamicModelSerializer, self).__init__(*args, **kwargs)

    if fields is not None:
        # Drop any fields that are not specified in the `fields` argument.
        allowed = set(fields)
        existing = set(self.fields.keys())
        for field_name in existing - allowed:
            self.fields.pop(field_name)

    if exclude is not None:
        for field_name in exclude:
            self.fields.pop(field_name)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态更改 Django Rest Framework 嵌套序列化器的深度? 的相关文章

随机推荐

  • 如何编译 GnuTLS

    我尝试在 Centos 6 2 上多次编译 GnuTLS 库 但没有成功 这些是步骤 我下载了荨麻2 4 root localhost opt wget http www lysator liu se nisse archive nettl
  • AngularJS 模板。内部JS不执行

    我有很多模板html页面 其中包含js代码 当我的 RouteProvider 加载此模板之一时 JS 不会执行 我不想使用 eval 我可以在外部 js 文件中编写代码并使用 requireJS 但我不知道如何使用 requireJS 停
  • JSON 数组结构变体

    以下是 3 种 JSON 数组结构格式 第一个是 JSON org 上概述的 是我熟悉的 格式 1 People name Sally age 10 name Greg age 10 第二个是命名数组元素的细微变化 我个人并不关心它 你不在
  • 如何在 Eclipse 中包含 javax.jms.* ?

    我正在尝试使用 eclipse 实现 JMS 但是当我尝试保存代码时 它表明javax jms cannot be resolved并且有no suggestions以及它推荐的 我怎样才能包含它并使用它 当我谷歌搜索时 我发现 javax
  • 如何找出我的控制台应用程序正在哪个目录中运行?

    如何找出我的控制台应用程序在 C 中运行的目录 要获取 exe 文件所在的目录 AppDomain CurrentDomain BaseDirectory 获取当前目录 Environment CurrentDirectory
  • Meteor JS 无法对数据进行排序

    我的主体中有一个按钮 单击该按钮时 应按降序排序 当我这样做时 什么也不会发生 我相信我的代码是正确的 但也许我遗漏了一些东西 这是js Tasks new Mongo Collection tasks Template body even
  • 如何使用 pdf.js 渲染 pdf 文件?

    我创建了一个 html 文件 内容如下索引 html
  • 使用 document.getElementById 更改“id=”的值

    这是正确的方法吗 a href class btn load add a a href here a 如
  • 重新加载 React Router 应用程序时出现 404 错误

    当我在本地服务器上重新加载我的应用程序时 一切都很好 但是当我在 gh pages 上托管时重新加载页面时 出现 404 错误 它不会在主页上执行此操作 但会在其他两个页面上执行此操作 这是否与远程托管有关 我对 React Router
  • Swift CoreBluetooth:CentralManager 应该在单独的线程中运行吗?

    现在我在主线程中运行所有内容 到目前为止 我只注意到 UI 变得有点滞后的多次中的一次 我想知道 utilizint CoreBluetooth 库在并发方面的一般做法是什么 您能否提供一些示例 具体应该在其他队列中运行什么 如果有的话 我
  • MQTT 连接在 Node 中工作,但不能作为 ReactJS 组件

    当我在 nodeJS 中运行它时 我有这个 mqtt 连接工作正常 但是当我将它移动到反应组件中时 我收到此错误 WebSocket 握手期间出错 net ERR CONNECTION RESET 我读过这是由与这里的默认端口有关的事情引起
  • J2ME 软键包装器

    阅读一些文章 告诉我软键因设备而异 有人说 6 或 21 表示左软键 7 或 22 表示右软键 鉴于这种情况 是否有任何好的包装器或功能或最佳实践来正确处理它 如果不适用于所有设备 那么支持大多数设备的最佳方式是什么 有轻微的黑客攻击或根本
  • Await 阻塞 UI 线程,网络相关

    我的 Windows 应用商店应用程序中有这段代码 我在其中处理按钮单击 但不知何故 当我在极少数情况下单击此按钮时 用户界面会冻结 当我连接到比我通常连接的网络更远的 Wi Fi 网络时 通常会发生这种情况 考虑到我从互联网上下载了 RS
  • 我应该如何为回合制多人 iPhone 棋盘游戏构建数据库和 API 服务器? (考虑nodejs、mongo、couch等)

    我正在为 iPhone 以及最终的 Android 开发一款回合制棋盘游戏 我正在使用 Appcelerator Titanium 来开发它 我的多人游戏设计类似于 Words With Friends 用户准备好后轮流进行 然后对手的游戏
  • 在不使用任何框架的情况下用 Ruby 完成 Web 应用程序 - 有多难?陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是一个 Ruby 菜鸟 这个社区中有人编写过没有任何框架的 Ruby 应用程序吗 编辑 我的目标是自己写一篇 告诉我们您的经历 有多
  • 无法迭代 JSON 数组

    我有一个 api 在 NODEJS 中 响应 它返回一个数组 res json friends id 7795239 username janesmith id 1363327 username johnsmith 但是 当我想在发送此响应
  • 为什么 Azure AD 的“请求 API 权限”中禁用了“应用程序权限”?

    我正在尝试授予控制台应用程序调用 Azure AD 中的 API 的权限 当我转到 添加权限 时 应用程序权限 显示为灰色 我只能选择 委派权限 我的理解是应用程序权限适用于控制台应用程序 因为它在后端运行并且用户不登录它 从 应用程序权限
  • jQuery find - 它返回元素的顺序是什么?

    我一直在使用 jQueryfind方法并且非常有用 然而 我遇到了一个例子 其中find似乎是在重复内容 并且没有按照文档中出现的顺序返回元素 我不确定 find 是否应该这样做 我对此表示怀疑 但是 它找到的元素不应该有重复并且显示错误的
  • 调整原子向量的大小?

    如何调整原子向量的大小 例如 以下代码无法编译 include
  • 如何动态更改 Django Rest Framework 嵌套序列化器的深度?

    我有一组嵌套序列化器 其中有一个depth设置在各自的Meta类 我想根据视图中传递的参数以编程方式更改深度 class ResourceSerializer serializers ModelSerializer type seriali