首页 > 其他分享 >drf之多表关联反序列化保存read_only与write_only

drf之多表关联反序列化保存read_only与write_only

时间:2023-04-21 17:46:29浏览次数:45  
标签:name read publish models only authors 序列化

目录
假如前端传入了一组数据:
{name:'赛尔达传说:王国之泪', price: 350, publish: 1, authors: [1, 2]}
如上: publish按id传入,authors也按id传入。

read_only与write_only

  • read_only用于序列化
  • write_only用于反序列化
  • 这两个是字段参数

示例

# 要新增的数据:
{'name': '恶魔之魂', 'price': '360', 'publish': '1', 'authors': [3, 4]}

models.py

from django.db import models


# Create your models here.
class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    # 图书与出版社外键字段,一对多
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
    # 图书与作者外键字段,多对多
    authors = models.ManyToManyField(to='Author')

    # 在模型表中定制序列化类
    @property
    def publish_detail(self):  # 定义的名字需要与serializer.py中定义的序列化类中的名字相同
        return {'name': self.publish.name, 'addr': self.publish.addr}

    @property
    def authors_detail(self):  # 定义的名字需要与serializer.py中定义的序列化类中的名字相同
        list = []
        for author in self.authors.all():
            list.append({'name': author.name, 'phone': author.phone})
        return list


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)


class Author(models.Model):
    name = models.CharField(max_length=32)
    phone = models.CharField(max_length=11)

serializer.py

from rest_framework import serializers
from app01 import models


class BookSerializers(serializers.Serializer):
    # 不指定read_only与write_only则表示可以用来读也可以用来写
    name = serializers.CharField()
    price = serializers.CharField()

    # 指定read_only表示只用来读,也就是序列化
    publish_detail = serializers.DictField(read_only=True)
    authors_detail = serializers.ListField(read_only=True)

    # 指定write_only表示只用来写,也就是反序列化
    publish = serializers.CharField(write_only=True)
    authors = serializers.ListField(write_only=True)

    # 新增就需要重写create方法
    def create(self, validated_data):
        # validated_data是字典类型{'name': '恶魔之魂', 'price': '360', 'publish': '1', 'authors': [3, 4]}
        book = models.Book.objects.create(name=validated_data.get('name'),
                                          price=validated_data.get('price'),
                                          publish_id=validated_data.get('publish'))
        # 反序列化保存多对多关系表
        book.authors.add(*validated_data.get('authors'))
        return book

views.py

from rest_framework.response import Response
from rest_framework.views import APIView
from app01 import models
from app01.serializer.serializer import BookSerializers


class BookView(APIView):
    def get(self, request):
        book_obj = models.Book.objects.all()
        book_ser = BookSerializers(instance=book_obj, many=True)
        return Response(book_ser.data)

    def post(self, request):
        book_ser = BookSerializers(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response({'code': 100, 'msg': '新增成功'})
        else:
            return Response({'code': 101, 'msg': book_ser.errors})

标签:name,read,publish,models,only,authors,序列化
From: https://www.cnblogs.com/smyz/p/17341195.html

相关文章

  • java如何使用线程池 new threadPoolExecutor()
    //使用线程池不返回结果脚本中使用的ClassB{privatestaticfinalExecutorServiceexecutor=newThreadPoolExecutor(4,10,3000L,TimeUnit.MILLISECONDS,newArrayBlockingQueue<>(500),newThreadFactoryBuilder().setNameFormat("publish-pool-%d").build(),(......
  • Handler和HandlerThread
    1.什么是Handler?SDK中关于Handler的说明如下:AHandlerallowsyoutosendandprocess MessageandRunnableobjectsassociatedwithathread's MessageQueue.EachHandlerinstanceisassociatedwithasinglethreadandthatthread'smessagequeue.Whenyoucreate......
  • 【韦东山RT-Thread系列教程】P1-P10笔记
    1、线程在切换时,仅仅保存中间结果。例如,b=a+10包含tmp=a+10与b=tmp两个过程,当执行完tmp=a+10后,线程出现切换,那么OS需要保存这个中间结果。2、汇编跳转指令——BL指令(即BranchAndLink)BL指令的作用之一是记录返回地址,然后执行当前指令。如下函数:fun(){add_val(......
  • Abbyy FineReader是什么软件 2023年有免费Abbyy软件的吗
    在数字化时代,数据处理和转换变得非常重要,AbbyyFineReader就是一款专门用于处理、转换和识别图像和PDF文件的软件。在本文中,我们将会详细介绍AbbyyFineReader的功能以及适合使用该软件的电脑。                         ......
  • C#基础 readonly 构造函数初始化readonly字段
     .NETFramework:4.7.2       IDE:VisualStudioCommunity2019        OS:Windows10x64    typesetting:Markdown 基础代码codeusingSystem;namespaceConsoleApp{classMyClass{privatereadonlystringstr;pu......
  • selenium报错:This version of ChromeDriver only supports Chrome version 109 Curren
    前言:跟GPT交互,让其写一段代码,执行失败。经过排查验证,GPT写的代码没有问题,是本地环境问题。执行报错:selenium.common.exceptions.SessionNotCreatedException:Message:sessionnotcreated:ThisversionofChromeDriveronlysupportsChromeversion109Currentbrowser......
  • input设置不可写,只读 disabled 和 readonly
    评:实现input的只读效果的两种方法:disabled和readonly。Disabled说明该input无效,及其value不会传递给任何程序,比如asp、php等。Readonly仅仅是无法编辑,不影响其值的传递。Disabled使用:<INPUTtype=”text”name=”username”value=”james”disabled>Readonly使用:<INPUTty......
  • 关于项目组件打包时遇到 `Uncaught TypeError: Cannot read property 'toLowerCase' o
    在全局注册组件时采用遍历组件池的方法时 每个组件都应该具备name属性 否则会出现UncaughtTypeError:Cannotreadproperty'toLowerCase'ofundefined  ......
  • java ThreadPool 线程池
    线程池的参数corePoolSize为核心线程;maximunPoolSize为最大线程;keepAliveTime为最长生命时间;unit是其时间单位;workQueue任务队列;handler是过多线程之后的策略对于线程池的处理线程机制,网上有一堆,但是机制核心是优先处理核心线程,优先堆满线程池,初学者建议不用轻易使用拒绝策略,除非......
  • ReentrantReadWriteLock
     1)背景   jni的使用场景,多线程读,单线程写,写的时候会更新java对象,当老的java对象无须再使用的时候必须释放jni所占用本地方法区的内存,这个区域的内存不在javaheap范畴,因此也无法被垃圾回收掉,需要显式的释放。但问题在于什么释放?有人会说使用finalize,但finalize过于依赖jvm的......