django自帶的序列化工具serializers
三步驟
- 導入 from django.core import serializers
- 生成對象並傳參 response = serializers.serialize('json', book_list)
- 第一個json是解析器,說明要解析成json格式的字符串,
- 第二個是queryset對象,
- 最後返回結果 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)
如下圖, 字典中的字段無用的就太多了會給網絡帶來擁堵
drf的Serializer的簡單使用
三步驟
- 導入 from rest_framework import serializers
- 寫一個類,繼承 serializers.Serializer
- class BookSerializers(serializers.Serializer)
- 類的方法中生成對象 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屬性
-
更改前臺查看的名稱 source="name"
class BookSer(serializers.Serializer): bookname = serializers.CharField(source="name") 前臺中的字典就會將name更改成爲 "bookname": "python",
-
多表操作
-
表模型中添加 __str__
當前臺字典直接以對象的結果返回時,後臺只需要 更改source "publish": "Publish object (2)" models對應的模型添加 def __str__(self): return self.name
-
使用source 指定字段
指字表模型中存在的段, 這個publish如果有source之後就可以隨意更改 publish = serializers.CharField(source='publish.city') source="publish.city" 最終查詢是 book.publish.city 進行查詢
-
表模型中添加 使用一個方法
在返回對象的表模型中添加一個方法, 然後在serializers中用source 直接查詢 def get_city(self): return self.city publish = serializers.CharField(source='publish.get_city')
-
SerializerMethodField
-
自定義方法
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}] }
-
直接將查詢的結果 序列化
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方法
-
獲取全部的
# 這個表下所有的字段都會在前臺展示 class BookSer(serializers.ModelSerializer): # 這個是固定格式 class Meta: model = models.Book fields = "__all__"
-
類似於白名單
class BookSer(serializers.ModelSerializer): # 這個是固定格式 class Meta: model = models.Book fields = ["nid","publish"] # 只要這兩個 # 如果寫了自定義的值,那麼這個名稱就需要與fields中定義的一樣 publish = serializers.CharField(source="publish.name")
-
類似於黑名單,過濾, 不能與fields同時存在
class BookSer(serializers.ModelSerializer): # 這個是固定格式 class Meta: model = models.Book exclude = ["authors"] # 過濾掉它
-
查詢深度
class BookSer(serializers.ModelSerializer): # 這個是固定格式 class Meta: model = models.Book fields = "__all__" # 官方建議是不要超過10的深度, 一層一層的查詢, 實際中使用最好不要超過3層 depth = 1 sqlite 如果有時間那麼查詢的話,會有超長的錯誤提示
Meta下的方法
-
重寫方法
# 這個表下所有的字段都會在前臺展示 class BookSer(serializers.ModelSerializer): # 這個是固定格式 class Meta: model = models.Book fields = "__all__" # 重寫方法 在Meta下 publish = serializers.CharField(source="publish.name")
-
也可以用序列化的方式
authors = serializers.SerializerMethodField() def get_authors(self, obj): auth = obj.authors.all() msg = Authors(auth, many=True) return msg.data