ModelSerializer

  1.ModelSerializer类似于ModelForm

  2.根据模型自动生成一组字段

  3.自带实现了.update()以及.create()方法

ModelSerializer的使用

1.创建原信息   class Meta:

2.指定序列化的模型类 model = "XX"

3.序列化的字段列表  fields = ["xxx"] 

4.序列化不包含指定字段的列表 exclude = ["xxx"] 

5.找到外键关系,并将所有的外键都变为read_only=true

6.给指定的字段添加参数属性  extra_kwargs = {}

ModelSerializer的方法字段   dserializers.SerializerMethodField()

一般用于正序列化
1.自定义字段方法 get_字段
2.返回值是 SerializerMethodField()的返回值

'''
基于ModelSerializer的序列化器
''' from rest_framework import serializers
from SerDemo.models import Book class BookSerializer(serializers.ModelSerializer):
# SerializerMethodField() 方法字段,返回值是该字段方法的返回值
# SerializerMethodField() 一般用于正序列化
newcategory = serializers.SerializerMethodField(read_only=True)
newpublisher = serializers.SerializerMethodField(read_only=True)
newauthors = serializers.SerializerMethodField(read_only=True) # 字段方法,必须有obj参数,返回值给category_text字段
def get_newcategory(self,obj):
return obj.get_category_display() # 外键关系的展示方法
def get_newpublisher(self,obj):
return {"id":obj.publisher_id,"title":obj.publisher.title} # 多对多关系的展示方法
def get_newauthors(self,obj):
return [{"id":author.id,"name":author.name} for author in obj.authors.all()] class Meta:
model = Book # 序列化的模型
fields = "__all__" # 序列化所有字段 # fields = ['id','title'] 序列化列表内的字段
# exclude = ['publisher','authors'] 序列化模型内排除列表内的字段
# depth = 1 根据外键关系往内找1层,但所有的外键都变成read_only = True # 给原来的字段添加属性
extra_kwargs = {
"category":{"write_only":True}, # 字段: {参数:参数值}
"publisher":{"write_only":True},
"authors":{"write_only":True},
}
from utils.model_serializers import BookSerializer       # 导入序列化组件
from .models import Book
from rest_framework.views import APIView
from rest_framework.response import Response class BookView(APIView):
def get(self,request):
# 找到所有的模型对象
book_queryset = Book.objects.all() # 对模型对象进行序列化,返回序列化对象
ser_obj = BookSerializer(book_queryset,many=True) # 多个模型对象使用many=True
return Response(ser_obj.data) def post(self,request):
# 将前端获取的数据,返回序列化对象
ser_obj = BookSerializer(data=request.data) # 对序列化对象进行校验
if ser_obj.is_valid():
# 校验通过,创建对象
ser_obj.save()
return Response(ser_obj.data) # 返回新增的对象
else:
return Response(ser_obj.errors) # 返回错误信息 # 带id的查询、更新、删除
class EditBookView(APIView):
# 根据id查看数据
def get(self,request,id):
# 根据ip找到模型对象
book_obj = Book.objects.filter(pk=id).first() # 对模型对象进行序列化,返回序列化对象
ser_obj = BookSerializer(book_obj) # 返回序列化对象的数据
return Response(ser_obj.data) # 根据id更新数据
def put(self,request,id):
# 根据ip找到模型对象
book_obj = Book.objects.filter(pk=id).first() # 将获取的数据根据模型对象进行序列化,返回序列化对象
ser_obj = BookSerializer(instance=book_obj,data=request.data,partial=True)
# partial=True 部分匹配
# data=request.data 前端提交的数据
# instance=book_obj根据id找到的实例化对象 # 对实例化对象进行校验
if ser_obj.is_valid():
# 校验通过,调用save进行更新
ser_obj.save() # 内部调用序列化器的update方法
return Response(ser_obj.data)
else:
return Response(ser_obj.errors) # 返回错误信息 # 根据id删除数据
def delete(self,request,id):
# 根据ip找到模型对象
book_obj = Book.objects.filter(pk=id).first() if book_obj:
book_obj.delete()
return Response("删除成功")
else:
return Response("删除失败")

【DRF框架】序列化组件——ModelSerializer的更多相关文章

  1. drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)

    ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...

  2. 第三章、drf框架 - 序列化组件 | Serializer

    目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...

  3. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...

  4. drf框架serializers中ModelSerializer类简化序列化和反序列化操作

    0905自我总结 drf框架serializers中ModelSerializer类 基于seriallizer类进行简化 https://www.cnblogs.com/pythonywy/p/11 ...

  5. drf框架序列化和返序列化

    0903自我总结 drf框架序列化和反序列化 from rest_framework import serializers 一.自己对于序列化和反序列化使用的分类 前后端交互主要有get,post,p ...

  6. DRF的序列化组件

    目录 DRF的序列化组件 Serializer组件 序列化 反序列化 ModelSerializer组件 序列化和反序列化 自定义Response方法 基表相关 DRF中ORM的多表关联操作 外键设计 ...

  7. DRF框架(三)——media资源路径设置、多表设计复习及补充、序列化组件(ModelSerializer)操作多表(序列化与反序列化)、多表序列化与反序列化整合(重点)

    media资源路径设置  (设置好后把图片放在这个文件夹中,通过链接能访问到图片) 1.先在根目录设置一个media文件夹 2.配置settings.py,加上下面的 MEDIA_URL = '/me ...

  8. Django框架(十八)—— drf:序列化组件(serializer)

    序列化组件 # 模型层 from django.db import models class Book(models.Model): nid = models.AutoField(primary_ke ...

  9. Django框架(十九)—— drf:序列化组件(serializer)

    目录 序列化组件 一.利用for循环来实现序列化(繁琐) 二.利用Django提供的序列化组件(不可控需要的字段) 三.利用drf提供的序列化组件 1.基于Serializer类实现序列化--基本语法 ...

随机推荐

  1. 【Leetcode_easy】1025. Divisor Game

    problem 1025. Divisor Game 参考 1. Leetcode_easy_1025. Divisor Game; 完

  2. consul分布式集群搭建&简单功能测试&故障恢复【h】

    环境准备五台机器: 操作系统 IP Ubuntu 16.04.3 LTS x86_64 192.168.1.185 Ubuntu 16.10 x86_64 192.168.3.152 Ubuntu 1 ...

  3. 利用卷积神经网络处理cifar图像分类

    这是一个图像分类的比赛CIFAR( CIFAR-10 - Object Recognition in Images ) 首先我们需要下载数据文件,地址: http://www.cs.toronto.e ...

  4. go创建模块化项目

    比如我要创建一个xxx-system,里面可能有多个子模块,步骤如下: 1.mkdir xxx-system 2.cd xxx-system 3.在xxx-system目录下创建一系列的service ...

  5. D1. Docker: win7 环境下安装 Docker

    [下载与安装] win7.win8 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/docker-too ...

  6. Python17之函数、类、模块、包、库

    一.函数 一个拥有名称.参数和返回值的代码块. 需要主动调用,否则不会执行,可以通过参数和返回值与其它程序进行交互 二.类 用来描述具有相同的属性和方法的对象集合.它定义了该集合中每个对象所共有的属性 ...

  7. Python15之字符串的格式语句与操作符

    一.字符串的format()函数 字符串1.format(赋值)                         字符串中必须表明需要格式化的位置 format()函数使用时,花括号中的值表明字符串中 ...

  8. PHP get和post向服务器发送请求

    1 .get请求 <?php //请求url地址 $token="xxx"; $url = "请求的地址"; //初始化curl $ch = curl_i ...

  9. Django框架2——模板

    django框架2--模板 直接将HTML硬编码到你的视图里却并不是一个好主意: 对页面设计进行的任何改变都必须对 Python 代码进行相应的修改. 站点设计的修改往往比底层 Python 代码的修 ...

  10. 00 Python的变量

    变量分类 a.全局变量:在模块内.在所有函数外面.在class外面,这就是全局变量. b.局部变量:在函数内.在class的方法(构造.类方法.静态方法.实例方法)内(变量未加self修饰),这就是局 ...