zoukankan      html  css  js  c++  java
  • DAY97

    一、序列化组件之Serializer

    from django.http import JsonResponse
    from rest_framework.views import APIView
    from rest_framework.request import Request
    from rest_framework.response import Response
    from rest_framework import serializers
    from app01 import models
    
    class AuthorSerializers(serializers.Serializer):
        name = serializers.CharField(max_length=32)
        sex = serializers.CharField(max_length=32)
        
        
    class BookSerializers(serializers.Serializer):
        name = serializers.CharField(max_length=32)
        # source 可以指定字段,可以对字段重命名,不使用则前面的变量名必须和表一样
        book_price = serializers.CharField(max_length=32, source='price')
         
        # 跨表查询:查询书本的出版社名
        # 方式一
        # 使用该方法必须重写Publish表的__str__方法,不然显示的是publish对象
        # def __str__(self):
        #    return self.name
        # 显示 "publish": "北京出版社"
        publish = serializers.CharField()
          
            
        # 方式二
        # source可以指定字段,那么可以使用基于对象的跨表查询来引用publish.name
        publish = serializers.CharField(source='publish.name')
        
        
    	# 方式三
        # source不仅可以指定字段,还可以指定方法
        # def test(self):
        #     return self.name
        publish = serializers.CharField(source='publish.test')
    
        
        # 方法四
        # SerializerMethodField() 可以指定一个方法
        publish = serializers.SerializerMethodField()
        # 方法名必须是get_字段名,传入参数obj:当前的book对象
        def get_publish(self,obj):
            ll={'name':obj.publish.name,'email':obj.publish.email}
            return ll
        
        # 方法内部也可以使用序列化组件
        authors = serializers.SerializerMethodField()
        def get_authors(self,obj):
            # 拿到这本书的所有作者
            authors = obj.authors.all()
            author_ret = AuthorSerializers(authors, many=True)
            return author_ret.data
        
        
    class Books(APIView):
        def get(self, request, *args, **kwargs):
            books = models.Book.objects.all()
            ret = BookSerializers(books, many=True)
            return JsonResponse(ret.data, safe=False)
    
    

    二、序列化组件之ModelSerializer

    from django.http import JsonResponse
    from rest_framework.views import APIView
    from rest_framework.request import Request
    from rest_framework.response import Response
    from rest_framework import serializers
    from app01 import models
    
    class AuthorSerializers(serializers.Serializer):
        name = serializers.CharField(max_length=32)
        sex = serializers.CharField(max_length=32)
    
    class BookSerializers(serializers.ModelSerializer):
        # Meta是必须写的
        class Meta:
            # model:指定表
            model = models.Book
            # fields:显示的字段
            # 全部显示
            fields = '__all__'
            # 部分显示
            # fields = ['name','price']
            # exclude:不显示的字段,exclude和fields不能一块使用
            # exclude=['publish','authors']
            # depth:跨表显示的深度,不写默认为0,一般最好小于3
            # 比如depth=1,就显示作者信息和出版社信息;depth=2,作者详情表也显示
            # depth=1
    
        # 但是这样字段名就写死了,像出版社和作者就只显示ID
        # 可以重写字段
        publish = serializers.CharField(source='publish.name')
        authors = serializers.SerializerMethodField()
    
        def get_authors(self, obj):
            # 拿到这本书的所有作者
            authors = obj.authors.all()
            author_ret = AuthorSerializers(authors, many=True)
            return author_ret.data
    
    
    class Books(APIView):
        def get(self, request, *args, **kwargs):
            books = models.Book.objects.all()
            ret = BookSerializers(books, many=True)
            return JsonResponse(ret.data, safe=False)
    
  • 相关阅读:
    [已读]Sass与Compass实战
    微信小程序图片变形解决方法
    ES6基础教程一 学习笔记
    微信小程序图片放大预览
    Element ui表格展示多张图片问题
    Element ui表格展示图片问题
    使用element ui 日期选择器获取值后的格式问题
    在vue2.0中使用sass
    微信小程序左滑删除功能
    微信小程序用setData修改数组或对象中的一个属性值
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/10103468.html
Copyright © 2011-2022 走看看