在单个视图中序列化多个模型

2023-11-25

这是场景:

我有两个模型;文件对象和目录对象。

class DirObj(models.Model):
    [...]
    parent = models.ForeignKey('self')
    [...]

class FileObj(models.Model):
    [...]
    parent = models.ForeignKey(DirObj)
    [...]

我有以下序列化器:

class FileObjSerializer(serializers.ModelSerializer):
    [...]
    class Meta:
        model = FileObj

class DirObjSerializer(serializers.HyperlinkedModelSerializer):
    [...]
    parent = serializers.HyperlinkedRelatedField(
        view_name = 'dirobj-detail')
    class Meta:
        model = DirObj

假设当用户浏览到“/directories/[dir_id]”时我想返回该文件and在单个视图中由“dir_id”指定的 DirObj 的目录内容,该视图使用两个不同的序列化器。现在我有(不完全是,但足够接近,这样你就明白了要点)以下内容:

class DirContents(generics.GenericAPIView):
    def get(self, request, *args, **kwargs):
        files = FileObj.objects.filter(parent = kwargs.get('dir_id'))
        dirs = DirObj.objects.filter(parent = kwargs.get('dir_id'))
        files_serializer = FileObjSerializer(files, many = True)
        dirs_serializer = DirObjSerializer(dirs, many = True)
        response = files_serializer.data + dirs_serializer.data
        return Response(response)

这感觉就像一个丑陋的黑客。它还忽略浏览 API 时通常呈现的任何类型的超链接(即,HyperlinkedRelatedFields 不会像应有的那样显示为超链接。)是否有任何方法可以序列化任意数量的模型并在单个视图中返回它们,而无需破坏可浏览的 API 和/或必须做(我假设的)一堆额外的工作才能使超链接正常工作?

提前致谢!


您当前的代码所面临的问题,特别是链接不起作用,是因为您没有在任何上下文中传递到序列化器。

class DirContents(generics.GenericAPIView):
    def get(self, request, *args, **kwargs):
        files = FileObj.objects.filter(parent=kwargs.get('dir_id'))
        dirs = DirObj.objects.filter(parent=kwargs.get('dir_id'))

        context = {
            "request": request,
        }

        files_serializer = FileObjSerializer(files, many=True, context=context)
        dirs_serializer = DirObjSerializer(dirs, many=True, context=context)

        response = files_serializer.data + dirs_serializer.data

        return Response(response)

对于使用 mixins 的通用视图,这是自动完成的,但对于像这样的情况,需要手动传入。

对于任何来这里将两个模型组合成一个序列化器的人:

使用通用视图时,没有一种简单的方法可以在一个视图中支持多个不同的模型。看起来好像您没有使用它们来过滤查询集,所以这实际上是可以做到的,尽管无论如何都不会被认为是“干净”的。

class DirContents(generics.GenericAPIView):
    def get(self, request, *args, **kwargs):
        files = FileObj.objects.filter(parent=kwargs.get('dir_id'))
        dirs = DirObj.objects.filter(parent=kwargs.get('dir_id'))

        files_list = list(files)
        dirs_list = list(dirs)

        combined = files_list + dirs_list

        serializer = YourCombinedSerializer(combined, many=True)

        return Response(serializer.data)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在单个视图中序列化多个模型 的相关文章

随机推荐

  • 如何准确过滤 RGB 值以实现色度键效果

    我刚刚读过this教程并尝试了这个例子 所以我从网上下载了一个视频来自己测试 我所要做的就是在 if 条件下调整 RGB 值 这是示例中的示例代码 computeFrame function this ctx1 drawImage this
  • Android Facebook 示例应用程序在安装 FB 应用程序后无法登录

    起初我以为这是我的应用程序 但在使用任何 FB 示例应用程序时我遇到了完全相同的问题 以 HelloFacebookSample 为例 它为您提供一个登录按钮 登录后会显示您的照片并允许您发布状态更新 如果我的手机上没有安装 FB 应用程序
  • 将 URL 设置为 SEO 友好标题,使用破折号而不是 ID

    我正在使用 AngularJS 创建一个文章页面 其中包含各个文章详细信息的链接 这些链接基于 ID 以确保它们是唯一的 但我希望 URL 是带有破折号的标题 对 SEO 用户友好得多 而不是 ID 这是 Angular 示例 其中产品详细
  • 如何使用球衣发送 NTLM 验证的帖子请求?

    我正在使用 Java 对 Sharepoint 2013 进行 REST API 调用 如何使用 jersey Rest 客户端连接到 sharepoint 2013 注意 目前我正在使用 apache http 组件和NTCredenti
  • Python 错误代码

    我有一个 python 脚本 它使用 subprocess Popen 运行另一个 python 脚本的多个实例 每个实例都在不同的文件上运行 我收集了 300 个文件 我通过此过程运行这些文件以进行测试 每次运行时 都会有随机数量的文件失
  • Docker 远程 API 过滤器已退出

    我在 Docker Remote API 文档中看到过滤器可用于过滤状态 但我不确定如何形成请求 https docs docker com reference api docker remote api v1 16 list contai
  • 比较 Java 中的字符、整数和类似类型:使用 equals 还是 ==?

    我想确定一下 Java 中的一些事情 如果我有一个字符 一个整数或一个长整型以及诸如此类的东西 我应该使用 equals 还是 就足够了 我知道对于字符串 不能保证每个唯一字符串只有一个实例 但我不确定其他装箱类型 我的直觉是使用 equa
  • 在 Chrome/Mac 上强制 DOM 重绘/刷新

    每隔一段时间 Chrome 就会错误地渲染完全有效的 HTML CSS 或者根本不渲染 通过 DOM 检查器深入研究通常足以让它认识到其方式的错误并正确重绘 因此可以证明标记是好的 在我正在从事的项目中 这种情况经常发生 并且可以预见 因此
  • Android:以阿拉伯格式显示数字

    如何以阿拉伯格式显示数字 所以 如果我有整数 1 2 3他们成为 将区域设置设置为阿拉伯语 埃及 NumberFormat nf NumberFormat getInstance new Locale ar EG nf format i
  • 计算一行中有多少个 MySQL 字段被填充(或为空)

    我需要组合一种方法 使我能够量化用户已填充一行中的多少个字段 例如 User Name Age Country Gender Height 1 Mike 34 USA Male 6 2 Bill 23 CA 5 3 Jane 31 USA
  • .pdbrc 文件中的断点命令

    我想将断点命令保存在 pdbrc 就像是 b 81 commands 1 pp foo attr1 pp foo attr2 end b 108 commands 2 pp bar attr1 pp bar attr2 end 这将自动设置
  • 如何正确处理 nil UIApplication.sharedApplication().keyWindow

    当 的时候viewDidLoad称为视图应该被加载 但我总是崩溃UIApplication sharedApplication keyWindow为零 我应该把我的代码放在哪里 以便在加载视图后调用它 而不是每次用户回来时调用它 因此我已排
  • maven 着色 jar:更改输出位置

    我在使用 Maven Shade 插件时遇到困难 因为我希望将我的着色 jar 安装到与父 pom 相同的文件夹中 而不是本地src target目录 布局 maven 项目 guide parent pom xml projA pom x
  • 如何更改 ggplot2 条形图中的堆叠顺序?

    来自在线条形图指南 qplot factor cyl data mtcars geom bar fill factor gear 我怎样才能让 5 个坐在底部 4 个放在上面 3 个放在上面 qplot factor cyl data mt
  • 将 XMLDocument 写入具有特定换行符的文件 (c#)

    我有一个从文件中读入的 XMLDocument 该文件是 Unicode 并具有换行符 n 当我写回 XMLDocument 时 它有换行符 r n 这是代码 非常简单 XmlTextWriter writer new XmlTextWri
  • 为什么settimeout不延迟函数执行?

    function tryToDownload url oIFrm document getElementById myIFrm oIFrm src url alert url url escape url setTimeout delete
  • CreateFile("CONIN$" ..) 的作用是什么?

    我正在破解源代码plink使其与一致兼容 如果你不知道 unison是一个文件同步工具 它运行一个 ssh 命令来连接到远程服务器 但是Windows没有ssh exe 有 plink 它非常接近 但还不够接近 它的行为不像 unison
  • 使用 TFS API 和 SSRS 以编程方式生成报告

    是否有一种简单的方法可以使用 TFS API 和 SSRS 生成 PDF Excel Word 或 TIFF 格式的报告 我可以通过使用 TFS 的 SSRS 仪表板从组合框中选择参数来手动生成报告 但我想在我的 Web 应用程序中包含一个
  • ParseKit 的汇编器回调如何工作?我应该在哪里存储我所做的工作?

    我应该如何在 parsekit 中使用回调函数 假设我有以下规则 expr s expr p expr s expr p 我应该从生成的 PKAssembly 中弹出 3 个符号并添加第一个和最后一个数字 然后将答案推回堆栈吗 对于上述规则
  • 在单个视图中序列化多个模型

    这是场景 我有两个模型 文件对象和目录对象 class DirObj models Model parent models ForeignKey self class FileObj models Model parent models F