python_restframework(序列化)

django自帶的序列化工具serializers

三步驟

  1. 導入 from django.core import serializers
  2. 生成對象並傳參 response = serializers.serialize('json', book_list)
    • 第一個json是解析器,說明要解析成json格式的字符串,
    • 第二個是queryset對象,
  3. 最後返回結果 return JsonResponse(response, safe=False)
    • safe 爲false說明不是正經的json格式,裏面有可能套了列表 元組以及其它的格式字符串
from app01 import models
from django.shortcuts import render, HttpResponse
from django.core import serializers
from django.http import JsonResponse
from rest_framework.views import APIView

class BookManage(APIView):
    def get(self, request, *args, **kwargs):
        book_list = models.Book.objects.all()
        # serialize(format, queryset, **options)
        #            格式, 傳queryset對象, 其它選項
        response = serializers.serialize('json', book_list)
        # safe=False 如果不設置這個 當字典中還有其它的 如列表,返回就會報錯
        return JsonResponse(response, safe=False)

如下圖, 字典中的字段無用的就太多了會給網絡帶來擁堵

python_restframework(序列化)

drf的Serializer的簡單使用

三步驟

  1. 導入 from rest_framework import serializers
  2. 寫一個類,繼承 serializers.Serializer
    • class BookSerializers(serializers.Serializer)
  3. 類的方法中生成對象 bsl = BookSerializers(instance=book_list, many=True)
    • many=true 說明queryset對象中有多條,
    • many=false 說明字典中只有一條數據
from app01 import models
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework import serializers

# Create your views here.

class BookSerializers(serializers.Serializer):
    # 必須要注意的是  這個序列化組件的值 必須是序列化中字典中存在的值!!
    name = serializers.CharField()
    price = serializers.DecimalField(max_digits=5, decimal_places=2)

class BookManage(APIView):
    def get(self, request, *args, **kwargs):
        book_list = models.Book.objects.all()

        # 初始化方法 def __init__(self, instance=None, data=empty, **kwargs)
        # many 如果傳true就說明有多條,   kwargs.pop('many', None)
        # many 傳false說明就只有一條字典
        bsl = BookSerializers(instance=book_list, many=True)
        return JsonResponse(bsl.data, safe=False)

[{"name": "1111", "price": "11.11"}, {"name": "2222", "price": "22.22"}]

如果不想要其中的一個結果, 直接在serializers中註釋或刪除即可
# name = serializers.CharField()   註釋它之後
[{"price": "11.11"}, {"price": "22.22"}, {"price": "33.33"}, {"price": "44.44"}]

drs下的Serializer下的方法

source屬性

  1. 更改前臺查看的名稱 source="name"

    class BookSer(serializers.Serializer):
       bookname = serializers.CharField(source="name")
    前臺中的字典就會將name更改成爲  "bookname": "python",
  2. 多表操作

    1. 表模型中添加 __str__

      當前臺字典直接以對象的結果返回時,後臺只需要 更改source
      "publish": "Publish object (2)"
      models對應的模型添加
        def __str__(self):
            return self.name
    2. 使用source 指定字段

      指字表模型中存在的段,   這個publish如果有source之後就可以隨意更改
      publish = serializers.CharField(source='publish.city')
      source="publish.city" 最終查詢是   book.publish.city 進行查詢
    3. 表模型中添加 使用一個方法

      在返回對象的表模型中添加一個方法, 然後在serializers中用source 直接查詢    
        def get_city(self):
            return self.city
      
      publish = serializers.CharField(source='publish.get_city')

SerializerMethodField

  1. 自定義方法

    authors = serializers.SerializerMethodField()
    
    # 需要傳一個參數, 其實就是後臺views傳過來的 返回結果book_obj
    #  msg = BookSer(book_obj, many=True)
    def get_authors(self, book):
       msg = [{"author_name": author.name, "age": author.age} for author in book.authors.all()]
       return msg
    
       # 列表生成式, 返回的結果就是 
       {"publish":"xx出版社", 
       "authors": [
        {"name":"xx", 
        "age":11}]
       }
  2. 直接將查詢的結果 序列化

    class Authors(serializers.Serializer):
       name = serializers.CharField()
       age = serializers.IntegerField()
    
    class BookSer(serializers.Serializer):
       #  使用 SerializerMethodField 可以指定一個方法
       authors = serializers.SerializerMethodField()
       def get_authors(self, book):
           auth_obj = book.authors.all()
           msg = Authors(auth_obj, many=True)
           return msg.data
    # 結果與列表生成式的一樣

drs下的ModelSerializer

fields方法

  1. 獲取全部的

    # 這個表下所有的字段都會在前臺展示
    class BookSer(serializers.ModelSerializer):
       # 這個是固定格式
       class Meta:
           model = models.Book
           fields = "__all__"
  2. 類似於白名單

    class BookSer(serializers.ModelSerializer):
       # 這個是固定格式
       class Meta:
           model = models.Book
           fields = ["nid","publish"]    # 只要這兩個
       # 如果寫了自定義的值,那麼這個名稱就需要與fields中定義的一樣
       publish = serializers.CharField(source="publish.name")
  3. 類似於黑名單,過濾, 不能與fields同時存在

    class BookSer(serializers.ModelSerializer):
       # 這個是固定格式
       class Meta:
           model = models.Book
           exclude = ["authors"]  # 過濾掉它
  4. 查詢深度

    class BookSer(serializers.ModelSerializer):
       # 這個是固定格式
       class Meta:
           model = models.Book
           fields = "__all__"
            # 官方建議是不要超過10的深度, 一層一層的查詢,  實際中使用最好不要超過3層   
           depth = 1
    
    sqlite 如果有時間那麼查詢的話,會有超長的錯誤提示

Meta下的方法

  1. 重寫方法

    # 這個表下所有的字段都會在前臺展示
    class BookSer(serializers.ModelSerializer):
       # 這個是固定格式
       class Meta:
           model = models.Book
           fields = "__all__"
           # 重寫方法  在Meta下
           publish = serializers.CharField(source="publish.name")
  2. 也可以用序列化的方式

    authors = serializers.SerializerMethodField()
    def get_authors(self, obj):
       auth = obj.authors.all()
       msg = Authors(auth, many=True)
       return msg.data
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章