如何在DRF中通过一个请求创建多个对象(相关)?

2023-12-06

我有一个类代表一个作业,一个类代表一个标签,它描述了一个作业,然后我有一个类在它们之间建立了关系(联结表),因此一个作业可以由多个标签来描述:

class JobTag(models.Model):
    job = models.ForeignKey(Job, unique=False, related_name='jobtags')
    tag = models.ForeignKey(Tag, unique=False, related_name='Tag_For_Job')

    created_time = models.DateTimeField(auto_now_add = True)
    modified_time = models.DateTimeField(auto_now = True)

    class Meta:
        unique_together = ('job', 'tag',)

    def __unicode__(self):
        return 'Tag '+self.tag.name +' for job '+ self.job.name

然后我有序列化器:

class TagSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Tag
        fields = ('url','name','badge_pic')
        read_only_fields = ('name','badge_pic')

class JobTagSerializer(serializers.HyperlinkedModelSerializer):
    tag = TagSerializer()
    class Meta:
        model = JobTag
        fields = ('tag',)
        depth=1

class JobSerializer(serializers.HyperlinkedModelSerializer):
    jobtags=JobTagSerializer(many=True)
    class Meta:
        model = Job
        fields = ('url','name', 'employer','jobtags','description')
        read_only_fields = ('employer',)

所以 GET 请求的 http 响应是:

{
        "url": "http://127.0.0.1:8000/api/jobs/2/",
        "name": "Odprac mi sneh",
        "employer": "http://127.0.0.1:8000/api/users/4/",
        "jobtags": [
            {
                "tag": {
                    "url": "http://127.0.0.1:8000/api/tags/2/",
                    "name": "Odhadzovanie snehu",
                    "badge_pic": "http://127.0.0.1:8000/media/pictures/tags/0005.jpg"
                }
            }
        ],
        "description": "blablabla"
    }

我的问题非常明显,如何创建一个作业实例并通过一个 POST http 请求将它们与相关的 JobTags 一起保存?

我尝试重复这个方法http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations.

class JobSerializer(serializers.HyperlinkedModelSerializer):
        jobtags=JobTagSerializer(many=True)
        class Meta:
            model = Job
            fields = ('url','name', 'employer','jobtags','description')
            read_only_fields = ('employer',)
        def create(self, validated_data):
            jobtag_data = validated_data.pop('jobtags')
            job = Job.objects.create(**validated_data)
            JobTag.objects.create(job=job, **jobtag_data)
            return job

但它返回了“**之后的 create() 参数必须是映射,而不是列表”错误,那么 request.data json 应该是什么样子?

或者这种方法不能用于我的情况,我应该做一些完全不同的事情吗?

我将不胜感激任何帮助。

Edit

如果我尝试访问该列表:

def create(self, validated_data):
        jobtag_data = validated_data.pop('jobtags')
        job = Job.objects.create(**validated_data)
        JobTag.objects.create(job=job, **jobtag_data[0])
        return job

我生成另一个错误:“无法分配“OrderedDict()”:“JobTag.tag”必须是“Tag”实例。” 所以我猜我发布的 json 格式错误?我尝试以这种方式发布数据:

{
        "name": "Odprac mi sneh",
        "jobtags": [
            {
                "tag": {
                    "url": "http://127.0.0.1:8000/api/tags/2/"
                }
            }
        ],
        "description": "veela sneu nemam ruky makam makam makamam",           
    }

我相信你应该提供id而不是urlPOST 数据中每个标签的信息,如下所示:

{
    "name": "Odprac mi sneh",
    "tags": [
        {
            "id": 2
        },
        {
            "id": 3
        }
    ],
    "description": "veela sneu nemam ruky makam makam makamam"
}

然后,在你的create您应该能够迭代标签的方法:

def create(self, validated_data):
    tag_data = validated_data.pop('tags')
    job = Job.objects.create(**validated_data)

    for tag in tag_data:
        JobTag.objects.create(job=job, tag_id=tag["id"])

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

如何在DRF中通过一个请求创建多个对象(相关)? 的相关文章

  • python 可以检测它运行在哪个操作系统下吗?

    python 可以检测操作系统 然后为文件系统构建 if else 语句吗 我需要将 Fn 字符串中的 C CobaltRCX 替换为 FileSys 字符串 import os path csv from time import strf
  • Matplotlib 标准化颜色条 (Python)

    我正在尝试使用 matplotlib 当然还有 numpy 绘制轮廓图 它有效 它绘制了它应该绘制的内容 但不幸的是我无法设置颜色条范围 问题是我有很多图 并且需要所有图都具有相同的颜色条 相同的最小值和最大值 相同的颜色 我复制并粘贴了在
  • 打印 scrapy 请求的“响应”

    我正在尝试学习 scrapy 在遵循教程的同时 我正在尝试进行细微的调整 我想简单地从请求中获取响应内容 然后我会将响应传递到教程代码中 但我无法发出请求并获取响应内容 建议就好 from scrapy http import Respon
  • 替换字符串列表中的 \x00 的最佳方法?

    我有一个来自已解析 PE 文件的值列表 其中包括 x00每个部分末尾的空字节 我希望能够删除 x00字符串中的字节而不删除所有字节 x 文件中的 s 我试过做 replace and re sub 但并没有取得太大成功 使用Python 2
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 类属性在功能上依赖于其他类属性

    我正在尝试使用静态类属性来定义另一个静态类属性 我认为可以通过以下代码来实现 f lambda s s 1 class A foo foo bar f A foo 然而 这导致NameError name A is not defined
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • VSCode pytest 测试发现失败

    Pytest 测试发现失败 用户界面指出 Test discovery error please check the configuration settings for the tests 输出窗口显示 Test Discovery fa
  • 唯一的图像哈希值即使 EXIF 信息更新也不会改变

    我正在寻找一种方法来为 python 和 php 中的图像创建唯一的哈希值 我考虑过对原始文件使用 md5 和 因为它们可以快速生成 但是当我更新 EXIF 信息 有时时区关闭 时 它会更改总和 并且哈希也会更改 有没有其他方法可以为这些文
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • Pandas:根据列名进行列的成对乘法

    我有以下数据框 gt gt gt df pd DataFrame ap1 X 1 2 3 4 as1 X 1 2 3 4 ap2 X 2 2 2 2 as2 X 3 3 3 3 gt gt gt df ap1 X as1 X ap2 X a
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • 负整数的Python表示

    gt gt gt x 4 gt gt gt print b format x x 4 100 gt gt gt mask 0xFFFFFFFF gt gt gt print b format x mask x mask 4294967292
  • 在 pip.conf 中指定多个可信主机

    这是我尝试在我的中设置的 etc pip conf global trusted host pypi org files pythonhosted org 但是 它无法正常工作 参考 https pip pypa io en stable
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • 有负零吗?

    我正在编码简单的计算器只是为了开始 iPhone 开发 问题是我有一个 按钮 它应该通过执行一个简单的操作来否定已经放在屏幕上的任何内容 1 它工作正常 除非先前的输入是0 设想 屏幕空白或0 我点击 进行否定 然后当我点击例如9我希望它能
  • Java 中带有参数的高效 XSLT 管道

    这个问题的最佳答案描述了一种在 Java 中实现高效 XSLT 管道的技术 Java 中的高效 XSLT 管道 或将结果重定向到源 不幸的是 虽然 Transformer 似乎公开了一个用于设置 XSLT 参数的 API 但这似乎没有任何效
  • 如何使用 Jest 测试 asnyc 代码(或使用 jsdom 测试“image.onload”)

    编辑 我已经用 Promise 方式更改了我的代码 我正在写反应this由facebook创建的starter 我是测试方面的新手 现在我有一个关于图像的组件 它有一个检查图像大小的功能 import React Component fro
  • Drupal 7 Views - 按字段列出组

    我有一个列出类型内容的视图Bio 人物传记 但是 我想对其进行格式化 以便将它们分组在不同的标题下 我添加了一个新字段Bios内容类型是一个包含三个不同选项的下拉列表 Foo Bar and Baz 我想做的是将人员显示在各自组的标题下 现
  • 当视图使用主布局时,MVC 4 \ 表单提交按钮不起作用

    ok 经过长时间的调查 似乎当我创建一个与 layout cshtml 一起使用的视图时 我所拥有的表单中的提交按钮不起作用 没有任何操作返回到控制器 仅当我创建视图并取消选中 使用布局或母版页 时 该按钮才起作用 这看起来非常不清楚 所以
  • 如何使用 Spring RestTemplate 将列表或字符串数​​组传递给 getForObject

    我正在用 Spring 开发一些宁静的服务 我在将字符串数组或大字符串作为参数传递 获取到服务控制器时遇到问题 我的代码示例如下 控制器 RequestMapping value getLocationInformations pointL
  • HttpClient 订阅的响应标头未定义

    谁能告诉我为什么在从 http post 获取响应时没有收到任何标头的原因 this http post
  • 版本 5.5.4+ 中的 ItextSharp 字体颜色问题

    我有一些代码使用红色字体颜色创建红色 图章 string StampDate DateTime Now ToString MM dd yyyy string FontPath Server MapPath assets Fonts stri
  • 使用 Hadoop 版本 2.7.2 从 Spark 使用 S3a 协议访问 S3

    我正在尝试从 pyspark 版本 2 2 0 访问 s3 s3a 协议 但遇到了一些困难 我正在使用 Hadoop 和 AWS sdk 软件包 pyspark packages com amazonaws aws java sdk pom
  • OSMDroid:onTap 示例

    几周前我开始学习 Android 现在我需要你的帮助 我的任务是创建离线地图 使用 OSMDroid 和 Mobile Atlas Creator 上面有两个标记 它们之间的路径以及单击此标记后的一些活动 我已经做好了地图 标记和路径 这是
  • 如果缓存文件夹中不存在文件,则重写 htaccess

    我想检查缓存文件夹中是否不存在文件 然后将其重新连接到 php 文件 RewriteCond DOCUMENT ROOT cache 0 f NC RewriteRule jpg png gif css js include cache o
  • geodjango中按距离排序的效率如何(整个表)

    假设我有以下数据模型 Person models Model id models BigAutoField primary key True name models CharField max length 50 location mode
  • minSDK 低于 11 的 Android 设备上的 Google 地图 v2

    当我创建使用 Google 地图 API v2 的项目时 我遇到了这一行的问题 GoogleMap 地图 MapFragment getFragmentManager findFragmentById R id map getMap 据说我
  • ObjectListView 显示图标

    尝试将图标放入 ObjectListview 中 这是我应该放置图标的代码 objectListView1 SmallImageList imageList1 deleteColumn IsEditable true deleteColum
  • 使用 extjs 4 嵌套网格

    我可以将网格放入另一个网格的插件中 这是我的网格 我想放入配置 插件 扩展网格 var grid new Ext grid GridPanel store store columns header Customer Name dataInd
  • 是否可以在javascript中取消打印

    我正在使用这里找到的代码 检测浏览器打印事件检测用户是否想要打印该页面 到目前为止 它按预期工作 在 afterPrint 函数中 我调用一个函数 该函数创建并附加一个 iframe 其中包含另一个页面 该页面具有不同的 对需要打印的内容更
  • scanf 跳过所有直到出现字符串

    是否可以使用 scanf 跳过所有字符 直到到达特定字符串 我有一个 html 文件 我想跳过此字符串之前的所有字符 包括该字符串 h2 a href a href a a h2
  • 压缩阻塞文件中的记录的好算法是什么?

    假设您有一个由一堆固定大小的块组成的大文件 每个块都包含一定数量的可变大小的记录 每条记录必须完全适合单个块 并且根据定义 此类记录永远不会大于整个块 随着时间的推移 随着记录从这个 数据库 中移入和移出 记录会被添加到这些块中或从这些块中
  • G1GC 日志中的时间

    我读过 G1GC 日志中打印的一些不同时间的描述 但无法真正证明 理解当我在本地生成它们时 例如 以下日志是在我的 Java 11 电脑上生成的 我想知道 第一行的 0 500 毫秒与第二行的 0 01 秒有什么区别 应用程序是否暂停 由于
  • 如何在DRF中通过一个请求创建多个对象(相关)?

    我有一个类代表一个作业 一个类代表一个标签 它描述了一个作业 然后我有一个类在它们之间建立了关系 联结表 因此一个作业可以由多个标签来描述 class JobTag models Model job models ForeignKey Jo