Django rest_framework 序列化组件

serializer序列化组件

一、models准备

from django.db import models

# Create your models here.
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(null=True)
    xx = models.IntegerField(choices=((0, '文学类'), (1, '情感类')), default=1, null=True)
    publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE, null=True)
    authors = models.ManyToManyField(to='Author')

    def __str__(self):
        return self.name

    def xxx(self):
        return '123xxx'

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()

    def __str__(self):
        return self.name

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 xx2(self):
        return 'abc123'

二、序列化的两种方法:

2.1 Serializer

# app01serializer.py
from rest_framework import serializers
from app01 import models

class BookSerializer(serializers.Serializer):
    name = serializers.CharField()
    # 指定source=‘name’ ,表示序列化模型表中的name字段,重命名为name1
    # name 和 source=‘name’ 指定的name不能重名
    # name1 = serializers.CharField(source='name')
    # write_only 序列化的时候,该字段不显示
    # read_only 反序列化的时候,该字段不传
    price = serializers.CharField()
    publish = serializers.CharField(source='publish.name')
    # source不但可以制定一个字段,也可以指定一个方法
    # 下面的内容就是指定的方法
    func_con = serializers.CharField(source='xxx')
    # 跨表指定方法
    func_con2 = serializers.CharField(source='publish.xx2')

    book_type = serializers.CharField(source='get_xx_display', read_only=True)
    # 序列化出版社的详情,指定SerializerMethodField之后,可以对应一个方法,
    # 返回什么内容,publish_detail就是什么内容

    publish_detail = serializers.SerializerMethodField(read_only=True)

    # 对应方法固定写法: get_字段名字
    def get_publish_detail(self, obj):
        print(type(obj))
        return {'name': obj.publish.name, 'city': obj.publish.city}

    # 返回所有作者信息
    authors = serializers.SerializerMethodField(read_only=True)

    def get_authors(self, obj):
        authorser = AuthorSerializer(obj.authors.all(), many=True)
        return authorser.data
# views.py部分
from app01 import models
from app01.app01serializer import BookSerializer
from rest_framework.views import APIView
from rest_framework.response import Response

class Book(APIView):
    def get(self, request, *args, **kwargs):
        response = {'code': 100, 'msg': '查询成功!'}
        books = models.Book.objects.all()
        booker = BookSerializer(instance=books, many=True)
        print(type(booker.data))
        response['data'] = booker.data
        return Response(response)

    def post(self, request):
        # 实例化产生一个序列化类的对象,data是要反序列化的字典
        booker = BookSerializer(data=request.data)
        if booker.is_valid(raise_exception=True):  # 校验booker数据格式
            booker.create(booker.validated_data)

        return Response()

2.2 ModelSerializer

# app01serializer.py
from rest_framework import serializers
from app01 import models

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'
        depth = 1  # 跨表 (与下方被注释部分目的一样)
        # exclude=('name')  # 与field不能同时用
"""
    xx = serializers.CharField(source='get_xx_display')
    authors = serializers.SerializerMethodField()
    def get_authors(self, obj):
        ret = AuthorSerializer(instance=obj.authors.all(), many=True)
        return ret.data
"""
# views.py部分
def post(self,request):
        #实例化产生一个序列化类的对象,data是要反序列化的字典
        bookser=BookSerializer(data=request.data)
        # bookser.data
        if bookser.is_valid(raise_exception=True):
            #清洗通过的数据
            bookser.save()
        else:
            print(bookser.errors['name'][0])
        return Response()







原文地址:https://www.cnblogs.com/xt12321/p/11123776.html

时间: 2024-08-11 09:52:43

Django rest_framework 序列化组件的相关文章

rest_framework序列化,反序列化

序列化组件 from rest_framework.response import Response1.Response本质也是继承了httpresponse,比httpResponse还强大,传入一个字典,列表可以序列化2.会根据不同的请求客户端,返回不同的东西,如果是浏览器访问的话就返回一个页面,如果是手机端的话就返回数据 from django.db import models # Create your models here. class Book(models.Model): nid

DjangoRestFramework学习二之序列化组件、视图组件

目录 DjangoRestFramework学习二之序列化组件.视图组件 一 序列化组件 二 视图组件(Mixin混合类) DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},] Courses--- POST --->添加数据 -----> 返回添加的数据{ } course

19.DjangoRestFramework学习二之序列化组件、视图组件

一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},] Courses--- POST --->添加数据 -----> 返回添加的数据{ } courses/1 ---PUT---> 更新pk=1的数据 ----->返回更新后的数据{ } courses/1 --- DELETE---> 删除pk=1的数据 -----> 返回空

django rest_framework Serializers 序列化组件

为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化. 接下来我们看下django序列化和rest_framework序列化的对比~~ Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objects.values("id&quo

Django中rest_framework的认证组件,权限组件,频率组件,序列化组件的最简化版接口

url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.Login.as_view()), # Book表 url(r'^books/$',views.BookHandle.as_view({ 'get':'list', 'post':'create' })), url(r'^books/(?P<pk>\d+)/',views.BookHandle.as_view({ 'get':'retrieve

Django中rest_framework的APIView,序列化组件和视图组件

url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^books/$', views.BookHandle.as_view()), url(r'^books/(\d+)', views.GetBookHandle.as_view()), url(r'^publishs/$', views.PublishHandel.as_view()), ] views #####################################

python3-开发进阶Django中序列化以及rest_framework的序列化

一.django框架的序列化 直接上代码 1.这是app下的models.py from django.db import models # Create your models here. class Course(models.Model): title=models.CharField(max_length=32) 2.这是app下的view.py,两种序列化方法 from django.views import View from app01.models import Course c

$Django 序列化组件

1 序列化组件 from app01 import models from rest_framework import serializers from rest_framework.serializers import Serializer,ModelSerializer from django.http import JsonResponse class auth(Serializer): name=serializers.CharField() age=serializers.CharFi

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

目录 序列化组件 一.利用for循环来实现序列化(繁琐) 二.利用Django提供的序列化组件(不可控需要的字段) 三.利用drf提供的序列化组件 1.基于Serializer类实现序列化--基本语法 2.基于Serializer类实现序列化--高级语法 3.基于ModelSerializer类实现序列化 序列化组件 # 模型层 from django.db import models class Book(models.Model): nid = models.AutoField(primar