ModelSerializer
1.減小序列化類代碼
2.不需要重寫update,create
ser.py
class BookModelSerializer(serializers.ModelSerializer):class Meta:model=Bookfields='__all__' #序列化全部字段# fields=('name','price') # 序列化指定字段# exclude=('name',) # 與fields 不能共用 用于排除某個字段
views.py 書寫格式與原來一樣,只修改方法名字。
class BooksView2(APIView):def get(self, request):response=MyResponse()books = Book.objects.all()book_ser = BookModelSerializer(books, many=True) # 序列化多條。 如果一條,不需要寫response.data = book_ser.datareturn Response(response.get_dic)def post(self, request):response=MyResponse()# 新增沒有instance,只有databook_ser = BookModelSerializer(data=request.data)# 如果沒有data=,會報錯。第一個參數是instance# book_ser = BookSerializer(request.data)# 校驗字段if book_ser.is_valid():book_ser.save()response.data = book_ser.dataelse:response.status = 102response.msg = '新增數據校驗失敗'response.data = book_ser.datareturn Response(response.get_dic)
高級用法
source
1.可以該字段名
title_name=serializers.CharField(source='title')
2.可以用"."進行跨表
# 調用 book.publish,直接.publish,所以需要Publish里定義 __str__方法
publish=serializers.CharField()# 可以理解source 隱藏book.字段。publish = serializers.CharField(source='publish.email')
3.可以執行方法
# test為book類里定義的方法
title=serializers.CharField(source='test')
SerializerMethodField()
需要配套方法,方法名叫 get_字段名 返回值就是要顯示的東西
# 需要配套方法,方法名叫 get_字段名 返回值就是要顯示的東西authors=serializers.SerializerMethodField()def get_authors(self,instance):# book 對象authors=instance.authors.all()ll=[]for author in authors:ll.append({'name':author.name,'age':author.age})return ll