Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >如何使用外键发布和获取模型

如何使用外键发布和获取模型
EN

Stack Overflow用户
提问于 2022-06-01 23:27:49
回答 1查看 205关注 0票数 0

我正在从事一个NextJS + Django REST框架项目,其中有三个模型: Document、MySource和QuestionBlock。

  1. 文档与几个链接到所创建文档的“question_blocks”一起创建。它们是一起创建的,我已经用嵌套序列化器实现了这一点。
  2. 创建文档后,我希望能够发布链接到文档的MySource模型。然后,当我对文档发出GET请求时,还应该显示所有mysource对象。

POST请求:注意我如何将文档的id放在我想要链接的.

代码语言:javascript
代码运行次数:0
复制
{
  "url": "urlasdf",
  "title": "tuitle",
  "publisher": "afdfas ",
  "desc": "qwefqwef",
  "summary": "asdfasdf",
  "document": "J9DY2pE"
}

GET请求:我希望文档GET请求显示如下所示。

代码语言:javascript
代码运行次数:0
复制
"id": "LwpQr6Y",
    "question_blocks": [
        {
            "id": 16,
            "document": "LwpQr6Y",
            "title": "question 4",
            "content": "qweqgadssdffasdf asdf"
        },
        ]
    "mysource": [
                {
            "id": 16,
            "url": "google.com",
            etc. . .
        },
        ],
    "title": "renamed title",
    "template": "commonapp",
    "updated": "2022-05-19T02:16:00+0000",
    "created": "2022-04-21T06:59:05+0000"

奇怪的是,我没有看到下面的代码有任何错误,而且功能本身也正常工作。但是,当我试图获得至少有一个mysource对象的文档时,加载它需要几分钟时间,这让我认为我的代码有问题,可能会让DRF自己重复。

models.py

代码语言:javascript
代码运行次数:0
复制
class Document(models.Model):
    id = HashidAutoField(primary_key=True)
    title = models.CharField(max_length=100, default="Untitled")
    template = models.CharField(max_length=100, default="")
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

class QuestionBlock(models.Model):
    id = models.AutoField(primary_key=True)
    document = models.ForeignKey(
        Document,
        related_name="question_blocks",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
    )
    title = models.CharField(max_length=500, default="")
    content = models.CharField(max_length=100000, default="", blank=True)

class MySource(models.Model):
    id = models.AutoField(primary_key=True)
    document = models.ForeignKey(
        Document,
        related_name="mysource",
        on_delete=models.CASCADE,
        null=True,
        blank=True,
    )
    url = models.CharField(max_length=500, default="")
    title = models.CharField(max_length=500, default="", blank=True)
    publisher = models.CharField(max_length=500, default="", blank=True)
    desc = models.CharField(max_length=500, default="", blank=True)
    summary = models.CharField(max_length=500, default="", blank=True)

serializers.py

代码语言:javascript
代码运行次数:0
复制
class MySourceSerializer(serializers.ModelSerializer):
    class Meta:
        model = MySource
        fields = ("id", "url", "title", "publisher", "desc", "summary")

    def to_representation(self, instance):
        self.fields["document"] = DocumentSerializer(read_only=True)
        return super(MySourceSerializer, self).to_representation(instance)


class DocumentSerializer(serializers.ModelSerializer):
    id = HashidSerializerCharField(source_field="documents.Document.id", read_only=True)
    question_blocks = QuestionBlockSerializer(many=True)
    mysource = MySourceSerializer(many=True)

    class Meta:
        model = Document
        fields = "__all__"

    def create(self, validated_data):
        question_blocks = validated_data.pop("question_blocks")
        document = Document.objects.create(**validated_data)
        for qBlock in question_blocks:
            QuestionBlock.objects.create(document=document, **qBlock)
        document.save()
        return document

编辑:添加QuestionBlockSerializer以获取更多上下文

代码语言:javascript
代码运行次数:0
复制
class QuestionBlockSerializer(serializers.ModelSerializer):
    document = serializers.PrimaryKeyRelatedField(
        pk_field=HashidSerializerCharField(source_field="documents.Document.id"),
        read_only=True,
    )

    class Meta:
        model = QuestionBlock
        fields = "__all__"
        optional_fields = ["content"]
EN

回答 1

Stack Overflow用户

发布于 2022-06-01 23:51:51

我认为做这件事的合适方法可能是这样的:

代码语言:javascript
代码运行次数:0
复制
###imports
from django.forms.models import model_to_dict


class DocumentListingField(serializers.RelatedField):
    def to_representation(self, instance):
        return model_to_dict(instance.document)

然后在MySourceSerializer中删除to_representation函数并更新如下内容:

代码语言:javascript
代码运行次数:0
复制
class MySourceSerializer(serializers.ModelSerializer):
    document = DocumentListingField(many=False, read_only=True)

    class Meta:
        model = MySource
        fields = (
            "id", "url", "title", "publisher", "desc", "summary", "document")

*编辑:我将read_only集添加到True,因为这些模型使用的哈希菲尔德并不容易选择。

**编辑:导致响应缓慢的原因是,您有一个循环调用序列化程序,因此系统永远不知道何时停止。就在这里:

代码语言:javascript
代码运行次数:0
复制
class MySourceSerializer(serializers.ModelSerializer):
    def to_representation(self, instance):
        ...
        self.fields["document"] = DocumentSerializer(read_only=True) 
        #Mysource its calling Documentserializer
            ...
    #And here:
class DocumentSerializer(serializers.ModelSerializer):
    ...
    mysource = MySourceSerializer(many=True) #this one its calling the MysorceSerialize, so there are a endless loop recursion

来源:Django Rest框架-自定义关系字段

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72472264

复制
相关文章
python从日志文件中提取出现的ip
#coding:utf-8 ''' Created on 2015年4月13日 @author: Administrator ''' fp = open('rootaccess.07log','r') total_count = 0 ip_array = {} for eachLine in fp: ip = eachLine.split(" ")[0] if ip_array.has_key(ip): ip_array[ip] = ip_array[ip] + 1
tanmx
2018/05/25
1.3K0
从ceph对象中提取RBD中的指定文件
之前有个想法,是不是有办法找到rbd中的文件与对象的关系,想了很久但是一直觉得文件系统比较复杂,在fs 层的东西对ceph来说是透明的,并且对象大小是4M,而文件很小,可能在fs层进行了合并,应该很难找到对应关系,最近看到小胖有提出这个问题,那么就再次尝试了,现在就是把这个实现方法记录下来 这个提取的作用个人觉得最大的好处就是一个rbd设备,在文件系统层被破坏以后,还能够从rbd提取出文件,我们知道很多情况下设备的文件系统一旦破坏,无法挂载,数据也就无法读取,而如果能从rbd中提取出文件,这就是保证了即使文件系统损坏的情况下,数据至少不丢失
用户2772802
2018/08/06
4.9K0
如何从 Debian 系统中的 DEB 包中提取文件?
DEB 包是 Debian 系统中常见的软件包格式,用于安装和管理软件。有时候,您可能需要从 DEB 包中提取特定的文件,以便查看其内容、修改或进行其他操作。本文将详细介绍如何从 Debian 系统中的 DEB 包中提取文件,并提供相应的示例。
网络技术联盟站
2023/06/08
3.5K0
如何从 Debian 系统中的 DEB 包中提取文件?
Redo 日志从产生到写入日志文件
对于这样的剧情,想必大家不会陌生:美国大片中拯救世界的英雄,平时看起来跟普通人没啥区别,甚至还可能会有点让人看不上。
csch
2022/09/05
4620
Redo 日志从产生到写入日志文件
2021-10-13:单词接龙。字典 wordList 中从单词 beginWor
2021-10-13:单词接龙。字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列:序列中第一个单词是 beginWord 。序列中最后一个单词是 endWord 。每次转换只能改变一个字母。转换过程中的中间单词必须是字典 wordList 中的单词。给你两个单词 beginWord 和 endWord 和一个字典 wordList ,找到从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0。力扣127。
福大大架构师每日一题
2021/10/13
6390
fastq-dump从SRA文件中提取fastq文件
fastq-dump是SRAtoolkit中使用频率很高的命令,用于从SRA文件中拆解提取fastq文件。具体用法如下:
戈贝尔光和热
2018/12/27
8.8K0
Linux下从PDF文件中提取图片
PDF 其实本质上是一个文件包,比如某些 PDF 文件中有插图,这些插图都包含在这个 PDF 文件包中。Linux 下可以使用 pdfimages 命令来从 PDF 文件中提取图片文件。如果你的 Linux 发行版上没有该命令,需要安装 poppler-utils 软件。pdfimages 命令的语法格式如下:
hotarugali
2022/02/28
2.6K0
使用Python从PDF文件中提取数据
数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据。然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了解如何从pdf文件中提取数据,并将数据转换为诸如“csv”之类的格式,以便用于分析或构建模型。
HuangWeiAI
2020/07/27
4K0
使用Python从PDF文件中提取数据
linux下提取日志文件中的某一行JSON数据中的指定Key
今天在定位问题时,通过日志打印出来调用第三方接口的返回结果对象的值,但因为这个返回信息太多,导致日志打印时对应的这行日志翻了四五屏才结束,这种情况下不好复制粘贴出来去具体分析返回结果对象,主要是我们需要针对返回的json对象提取对应的key去进行分析查询。
翎野君
2023/05/12
5.3K0
从 PE 文件资源表中提取文件的版本信息
前段时间需要实现对 Windows PE 文件版本信息的提取,如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在 Windows 下当然有一系列的 API 函数供调用,简单方便。但是当需要在 Linux 操作系统平台下提取 PE 文件的版本信息数据时,就需要自己对 PE 文件的结构进行手动解析。
稻草小刀
2022/12/12
3.3K0
从 PE 文件资源表中提取文件的版本信息
python 统计文件中单词出现的频率
index = {} with open(sys.argv[1], encoding='utf-8') as fp: for line_no, line in enumerate(fp, 1): for match in WORD_RE.finditer(line): word = match.group() column_no = match.start()+1 location = (line_no, column_no) # this is ugly; coded like this to make a point occurrences = index.get(word, []) # <1> occurrences.append(location) # <2> index[word] = occurrences # <3>
用户5760343
2019/07/31
1.9K0
如何从Docker镜像中提取恶意文件
首先,需要从镜像运行启动一个容器,然后,使用docker cp命令从容器中提取文件到宿主机。
Bypass
2023/09/12
3170
如何从Docker镜像中提取恶意文件
从pdb文件中提取蛋白质序列
https://swift.cmbi.umcn.nl/servers/html/soupir.html
用户1359560
2020/09/08
3.9K0
从pdb文件中提取蛋白质序列
将Error异常日志从普通日志中剥离
  开发过程中经常需要调试和线上环境查看异常日志的需求,但普通消息与异常消息混在一起实在是非常难得找,上则NM的文档够你头痛,所以就将Error级别的日志抽离出来。   本示例采用log4net来配置:   1、先配置web.config,添加: <configSections> <!-- 添加log4net配置节 --> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4n
欢醉
2018/01/22
7500
将Error异常日志从普通日志中剥离
python:如何从 URL 中快速提取域名?
有时候,我们要从一段很长的 URL 里面提取出域名。例如从https://www.kingname.info/2020/10/02/copy-from-ssh/,我需要获取的是kingname.info。
王图思睿
2021/06/16
9.1K0
python 统计文件中单词出现的频率2
index = {} with open(sys.argv[1], encoding='utf-8') as fp: for line_no, line in enumerate(fp, 1): for match in WORD_RE.finditer(line): word = match.group() column_no = match.start()+1 location = (line_no, column_no) index.setdefault(word, []).append(location) # <1>
用户5760343
2019/07/31
1.3K0
从excel文件xlsx中特定单元格中提取图片「建议收藏」
第一种网上通用的用xlsx改zip压缩包,能批量提取出图片。但是无法知道图片在单元格中的顺序信息。
全栈程序员站长
2022/09/14
6.3K0
如何使用IPGeo从捕捉的网络流量文件中快速提取IP地址
 关于IPGeo  IPGeo是一款功能强大的IP地址提取工具,该工具基于Python 3开发,可以帮助广大研究人员从捕捉到的网络流量文件(pcap/pcapng)中提取出IP地址,并生成CSV格式的报告。在生成的报告文件中,将提供每一个数据包中每一个IP地址的地理位置信息详情。  报告中包含的内容  该工具生成的CSV格式报告中将包含下列与目标IP地址相关的内容: 1、国家; 2、国家码; 3、地区; 4、地区名称; 5、城市; 6、邮编; 7、经度; 8、纬度; 9
FB客服
2023/03/29
6.7K0
如何使用IPGeo从捕捉的网络流量文件中快速提取IP地址
Excel: 提取路径中的文件名
文章背景:在日常工作中,有时需要从绝对路径中提取文件名。比如,已知某个文件的存储路径,想要获取最后的文件名称。下面介绍两种方法。
Exploring
2022/09/20
2.7K0
Excel: 提取路径中的文件名
如何使用UnBlob从任意格式容器中提取文件
 关于UnBlob  UnBlob是一款针对容器安全的强大工具,该工具可以从任意格式的容器中提取文件。该工具运行速度非常快,准确率高,并且易于使用。UnBlob能够解析已知的超过30种不同格式的文档、压缩文件和文件系统,并能够从中递归提取文件内容。 UnBlob是完全开源免费的,并提供了一个命令行接口。除此之外,该工具还能够以Python库的形式来使用。这些特性使得UnBlob成为文件/数据提取、分析和逆向固件镜像的完美工具。 工具特性  1、准确率高:支持使用自定义规则识别数据区块的起始偏移量,并根
FB客服
2023/03/29
1.5K0
如何使用UnBlob从任意格式容器中提取文件

相似问题

如何解决空消息的toString何时到来?

12

值不显示子文件夹何时到来

10

Mongodb + Node:何时关闭

11

是否知道设备何时收到来自oneSingnal的通知?

25

如何知道何时收到来自服务器的响应?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文