序列化组件

from rest_framework import serializers


class AuthorSerializer(serializers.Serializer):
    nid = serializers.CharField()
    name = serializers.CharField()
    age = serializers.CharField()


# class BookSerializer(serializers.Serializer):
#     # 可以用source修改别名
#     xx = serializers.CharField(source='name')
#     price = serializers.CharField()
#     sb = serializers.CharField(source='publish.city')
#     test = serializers.CharField(source='publish.test')
#     publish_id = serializers.CharField()
#     # SerializerMethodField,可以指定一个方法
#     # publish=serializers.SerializerMethodField()
#     # # 方法名:叫get_字段名,要传参数,参数是:当前book对象
#     # def get_publish(self,obj):
#     #     # obj 是当前book对象0
#     #     dic={'name':obj.publish.name,'email':obj.publish.email}
#     #     return dic
#     authors=serializers.SerializerMethodField()
#     # def get_authors(self,book):
#     #     #拿到这本书的所有作者
#     #     aus=book.authors.all()
#     #     # 拼出一个列表,列表中套字典,每个字典是一个作者
#     #     ll=[]
#     #     for a in aus:
#     #         ll.append({'name':a.name,'age':a.age})
#     #     return ll
#     def get_authors(self,book):
#         #拿到这本书的所有作者
#         aus=book.authors.all()
#         # 可以继续用序列化类,来处理
#         auth_ser=AuthorSerializer(aus,many=True)
#         return auth_ser.data
from ap01.models import Book


# class BookSerializer(serializers.ModelSerializer):
#     # 必须写一个内部类,名字叫Meta
#     class Meta:
#         model = Book
#         fields = '__all__'
#     # 重写属性
#     publish = serializers.CharField(source='publish.name')
#     authors = serializers.SerializerMethodField()
#     def get_authors(self, book):
#         # 拿到这本书的所有作者
#         aus = book.authors.all()
#         # 可以继续用序列化类,来处理
#         auth_ser = AuthorSerializer(aus, many=True)
#         return auth_ser.data


class BookSerializer(serializers.ModelSerializer):
    # 必须写一个内部类,名字叫Meta
    class Meta:
        model = Book
        # fields = '__all__'
        # 指定只取这两个字段
        fields = ['nid','name']
        # 去掉指定的字段
        # exclude=['publish','authors']
        # fields,跟exclude不能连用
        # 指定深度(官方建议小于10,我给你的建议小于3)
        # depth = 2
mySer.py
from django.shortcuts import render
from ap01 import models
# Create your views here.
from rest_framework.views import  APIView
from ap01.mySer import  BookSerializer
from django.http import JsonResponse
class Books(APIView):
    def get(self,request,*args,**kwargs):

        ret=models.Book.objects.all()
        #生成一个序列化的对象,传参数
        #序列化多条,记住many=True
        book_ser=BookSerializer(ret,many=True)
        print(book_ser.data)
        return JsonResponse(book_ser.data,safe=False)
views.py

 

posted @ 2020-09-21 23:17  xuqidong  阅读(45)  评论(0编辑  收藏  举报