【DRF框架】序列化组件——ModelSerializer

生来就可爱ヽ(ⅴ<●) 提交于 2020-04-03 04:33:35

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("删除失败")

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!