第三章 restframework——序列化组件

第三章 restframework——序列化组件

一、django自带的序列化组件serializers

二、restframework的序列化组件Serializer

三、restframework的序列化组件ModelSerializer

四、restframework的序列化组件请求数据校验和保存功能(钩子)

五、restframework的序列化组件源码分析

一、django自带的序列化组件serializers

from django.core import serializers
def persons(request):
    ret = models.Person.objects.all()
    # person_list = []
    # for i in ret:
    #     person_list.append({"name":i.name,"age":i.age})
    # print(person_list)
    # import json
    # s = json.dumps(person_list)
    # print(s)
    from django.core import serializers
    s = serializers.serialize("json",ret)
    print(s)
    return HttpResponse(s)

二、restframework的序列化组件Serializer

扫描二维码关注公众号,回复: 3544878 查看本文章

先来看看django自带的cbv的json写法,然后我们再来看下restframework的写法

【django】

class PublishView(View):
    def get(self,request):
        # 方式一
        publish_list = list(Publish.objects.all().values('name','email'))
        return HttpResponse(json.dumps(publish_list))
        # 方式二
        from django.forms.models import model_to_dict
        publish_list = Publish.objects.all() temp = [] for obj in publish_list: temp.append(model_to_dict(obj)) return HttpResponse(json.dumps(temp)) # 方式三 from django.core import serializers publish_list = Publish.objects.all() temp = serializers.serialize("json",publish_list) return HttpResponse(temp)

【restframework】

from rest_framework import serializers
from rest_framework.response import Response
# 为queryset做序列化
class PublishSerializers(serializers.Serializer):
    # 下面写的字段取决于你需要哪些字段做序列化
    name = serializers.CharField()
    email = serializers.CharField()
    # publish=serializers.CharField(source="publish.name")
    # authors=serializers.CharField(source="authors.all")
class PublishView(View): def get(self,request): 
publish_list = Publish.objects.all()
pb = PublishSerializers(publish_list, many=True)
# many = true 代表前面传入的参数是queryset对象
# pb.data是把上面PublishSerializers内写的字段转为有序字典
       
# pb = PublishSerializers(model_obj,many = false)
# many = false 代表前面传入的参数是model对象 # 默认many = false,所以如果是model对象可以不用写many
# pb.data是直接把对象所有属性转为有序字典
return Response(pb.data)

注意:

source 如果是字段,会显示字段,如果是方法,会执行方法,不用加括号(authors=serializers.CharField(source='authors.all'))

如在模型中定义一个方法,直接可以在在source指定执行

准备工作

models.py

from django.db import models

# Create your models here.


class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.IntegerField()
    pub_date=models.DateField()
    publish=models.ForeignKey("Publish")
    authors=models.ManyToManyField("Author")
    def __str__(self):
        return self.title

class Publish(models.Model):
    name=models.CharField(max_length=32)
    email=models.EmailField()
    def __str__(self):
        return self.name

class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    def __str__(self):
        return self.name
View Code

三、restframework的序列化组件ModelSerializer

四、restframework的序列化组件请求数据校验和保存功能(钩子)

五、restframework的序列化组件源码分析

猜你喜欢

转载自www.cnblogs.com/neymargoal/p/9777322.html
今日推荐