Django框架(十九)—— 序列化组件(serializer)

目录

  • 序列化组件

    • 一、利用for循环来实现序列化(繁琐)
    • 二、利用Django提供的序列化组件(不可控需要的字段)
    • 三、利用drf提供的序列化组件
      • 1、基于Serializer类实现序列化——基本语法
      • 2、基于Serializer类实现序列化——高级语法
      • 3、基于ModelSerializer类实现序列化

序列化组件

# 模型层
from django.db import models

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField()

    publish = models.ForeignKey(to=‘Publish‘, to_field=‘nid‘, on_delete=models.CASCADE)
    authors = models.ManyToManyField(to=‘Author‘)

    def __str__(self):
        return self.name

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to=‘AuthorDatail‘, to_field=‘nid‘, unique=True, on_delete=models.CASCADE)

class AuthorDatail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name

    def test(self):
        return self.email

一、利用for循环来实现序列化(繁琐)

def get(self, request):
    response = {‘status‘: 100, ‘data‘: None}
    ll = [{‘name‘: book.name, ‘price‘: book.price} for book in books]
    # 返回数据是json格式数据
    response[‘data‘] = ll
    # safe = True 表示数据可以是列表
    return JsonResponse(response, safe=False)

二、利用Django提供的序列化组件(不可控需要的字段)

Django内置的serializers

from django.core import serializers

def get(self,request):
    books = models.Book.objects.all()
    ret=serializers.serialize(‘json‘,‘queryset对象‘)
    #ret就是序列化之后的字符串了,不需要再序列化了
    return HttpResponse(ret)

三、利用drf提供的序列化组件

1、基于Serializer类实现序列化——基本语法

-1 先导入
    from rest_framework.serializers import Serializer
    from rest_framework import serializers
-2 写一个类,继承Serializer
-3 在类内部写属性:
    name=serializers.CharField()
-4 使用:
    先生成对象,需要传参数 instance:要序列化的对象(可能是queryset,也可能是单个对象)
    many:如果是queryset---True,,如果是单个对象--False
-5 序列化的数据:对象.data --->是一个字典
from rest_framework.views import APIView
from rest_framework import serializers

class BookSerializer(serializers.Serializer):
    name = serializers.CharField()

class Book(APIView):
    def get(self, request):
        # 要序列化的对象(可以是queryset,也可以是单个对象)
        # book = models.Books.objects.filter(name=‘红楼梦‘).first()
        # ser = BookSerializer(instance=book,many=False)
        books = models.Books.objects.all()
        ser = BookSerializer(instance=books, many=True)
        data = ser.data
        return JsonResponse(data, safe=False)

2、基于Serializer类实现序列化——高级语法

(1)非关联字段或一对多字段

  • 可以不用source,直接用 字段名 当变量名,必须为字段名
  • 也可以用 source来指定需要的目标字段 (推荐,尽量让字段名不要泄露)
  • source也可以用来指定模型层中的方法
  • 一对多关联关系,可以在 source 中用 .来指定字段,例如取出版社名字,用 source=‘publish.name‘
from rest_framework.views import APIView
from rest_framework import serializers

class BookSerializer(serializers.Serializer):
    # 利用source来指定魔表字段,给key取别名
    aaa = serializers.CharField(source=‘name‘)  # 等价于 name = serializers.CharField()
    price = serializer.CharField()
    publish_name = serializer.CharField(source=‘publish.name‘)
    # source 也可以用来指定模型层中的方法
    t = serializer.CharField(source=‘publish.test‘)

class Book(APIView):
    def get(self, request):
        books = models.Books.objects.all()
        ser = BookSerializer(instance=books, many=True)
        data = ser.data
        return JsonResponse(data, safe=False)
    

(2)一对多或者多对多字段

  • 多对多要用SerializerMethodField(),然后定义一个get_变量名的方法,方法名字必须为 get_变量名
  • get_变量名方法要传参,传入当前对象,例如在 BookSerializer 中就是book对象
  • get_变量名方法中,也可以对数据进行序列化,例如取书的所有作者,就可以对作者序列化然后 return
from rest_framework.views import APIView
from rest_framework import serializers

# 用于对author的数据进行序列化
class AuthorSerializer(serliazer.Serializer):
    name = serializer.CharField()
    age = serializer.CharField()

class BookSerializer(serializers.Serializer):
    # 利用source来给key取别名
    aaa = serializers.CharField(source=‘name‘)  # 等价于 name = serializers.CharField()
    price = serializer.CharField()

    # book和publish是一对多的关系,也可以用SerializerMethodField
    publish = serializer.SerializerMethodField()
    def get_publish(self, book):
       pub = book.publish.name
       return pub

    # book和authors是多对多的关系,用SerializerMethodField
    au = serializer.SerializerMethodField()
    def get_au(self, obj):
        aus = obj.authors.all()
        ll = []
        for obj_au in aus:
            ll.append({‘au_name‘:obj_au.name,‘au_age‘:obj_au.age})
        return ll

    # 也可以在方法中使用序列化类序列化
    ‘‘‘
    def get_au(self, book):
        # 获取这本书的所有作者
        aus = book.authors.all()
        # 可以在方法中对authors的数据进行序列化
        au_ser = AuthorSerializer(aus,many=True)
        return au_ser.data
    ‘‘‘

class Book(APIView):
    def get(self, request):
        books = models.Books.objects.all()
        ser = BookSerializer(instance=books, many=True)
        data = ser.data
        return JsonResponse(data, safe=False)
    

3、基于ModelSerializer类实现序列化

(1)基本语法

from app01.models import Book

# 这样序列化得到的数据,authors是中都是author_id
class BookSerializer(serializer.ModelSerializer):
    class Meta:
        model = Book
        fields = ‘__all__‘

(2)重写属性

from app01.models import Book

# 这样序列化得到的数据,authors中都是author_id,publish也是publish_id
class BookSerializer(serializer.ModelSerializer):
    class Meta:
        model = Book
        fields = ‘__all__‘
    # 重写属性authors和publish
    puhlish = serializer.CharField(source=‘publish.name‘)
    authors = serializer.SerializerMethodField()
    def get_authors(self,book):
        aus = book.authors.all()
        # 可以在方法中对authors的数据进行序列化
        au_ser = AuthorSerializer(aus,many=True)
        return au_ser.data

(3)其他属性

  • fields = [‘id‘,‘name‘] ---------> 指定序列化这两个字段
  • exclude = [‘publish‘,‘create_time‘] ----------> 除了这两个字段外,其余的序列化
  • depth = 2 ----------> 指定深度,即跨表。值为1表示跨一次表;值为2表示跨两次表
class BookSerializer(serializers.ModelSerializer):
    # 必须写一个内部类,名字叫Meta
    class Meta:
        model = Book
        # fields = ‘__all__‘
        # 指定只取这两个字段
        fields = [‘nid‘,‘name‘]
        # 去掉指定的字段
        # exclude=[‘publish‘,‘authors‘]
        # fields,跟exclude不能连用
        # 指定深度(官方建议小于10,我给你的建议小于3)
        depth = 2

原文地址:https://www.cnblogs.com/linagcheng/p/10104270.html

时间: 2024-08-30 15:28:29

Django框架(十九)—— 序列化组件(serializer)的相关文章

drf框架 - 序列化组件 | Serializer

序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 反序列化: 将字符串反序列化成对象用于使用 drf的序列化与反序列化 序列化: 将Model类对象序列化成字符串用户传输 反序列化: 将字符串反序列化成Model对象用于使用 Serializer 序列化准备: 模型层: models.py class User(models.Model): SE

DRF框架之 serializers 序列化组件

1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers 分为:第一种 Serializer   第二种 ModelSerializer 第一种用法之 Serializer from django.db import models # Create your models here. class Book(models.Model): nid = mod

drf 核心 序列化组件Serializer

知识点: Serializer(偏底层).ModelSerialize(重点).ListModelSerializer(辅助群改) 一.Serializer 1.序列化准备: 模型层:models.py class User(models.Model): SEX_CHOICES = [ [0, '男'], [1, '女'], ] name = models.CharField(max_length=64) pwd = models.CharField(max_length=32) phone =

序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)

知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备: 模型层:models.py from django.db import models class User(models.Model): SEX_CHOICES = [ [0, '男'], [1, '女'], ] name = models.CharField(max_length=64) pw

Django框架基础之Form组件

服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息 form组件的2大功能:       1 验证(显示错误信息)       2 保留用户上次输入的信息                  -- 可以生成html标签应用: class A_Form(Form): 字段=fields.字段类型(默认参数: required=True, widget=widgets.插件(attrs={})) 常用字段:Charfield,RegexField,I

Django 框架篇(九): Django中的Form 组件

Django中的Form组件,帮我们处理了 form表单中的校验, 和错误提示的处理: 主要功能: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 使用form组件实现注册功能 1.  定义一个类, 继承django中的 forms.Form 代码实例: from django import forms # 按照Django form组件的要求自己写一个类 class RegForm(forms.Form): name = forms.CharField(label="用

DRF(Django Rest Framework)序列化组件接口使用和接口设计--!GET接口设计!

定义序列化器(本质就是一个类),一般包括模型类的字段,有自己的字段类型规则.实现了序列化器后,就可以创建序列化对象以及查询集进行序列化操作,通过序列化对象.data来获取数据(不用自己构造字典,再返回Json数据) INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.me

Django REST framework之序列化组件以及源码分析+全局、局部Hook

序列化两大功能 a.对queryset类型进行序列化 b.对用户请求的数据进行校验 a.对queryset类型进行序列化 举例说明: 表设计 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(models.Model): 9 user_type_choices = ( 10 (1, '普

Django框架(九)--cookie和session

cookie和session组件 cookie 1.cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况. 一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的. 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留.会话中产生的数据又是我们需要保存的,也就是说要“保持状态”.因此C

Django框架进阶7 forms组件(pycharm内置测试环境Python Console), cookie与session操作

forms组件 写一个注册页面 获取用户输入的用户名和密码 用户点击注册发送到后端做用户名密码的校验 用户名中不能包含金瓶mei 不符合社会主义核心价值观 密码不能为空 你个DSB,密码怎么能为空 1.手写获取用户输入的前端页面代码 渲染页面 2.后端获取用户数据并做合法性校验 校验数据 3.将校验之后的结果渲染到前端页面 展示信息 不用forms组件代码: app01/views.py from django.shortcuts import render,HttpResponse # Cre