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)
    
  • 相关阅读:
    ubuntu下python的错误
    Zookeeper(二) zookeeper集群搭建 与使用
    Zookeeper(一) zookeeper基础使用
    MapReduce(五) mapreduce的shuffle机制 与 Yarn
    MapReduce(四) 典型编程场景(二)
    Mysql(一) 基本操作
    MapReduce(三) 典型场景(一)
    MapReduce(二)常用三大组件
    MapReduce(一) mapreduce基础入门
    Hive(六)hive执行过程实例分析与hive优化策略
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/10103468.html
Copyright © 2011-2022 走看看