序列化组件
Posted liu--huan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化组件相关的知识,希望对你有一定的参考价值。
自己手撸序列化组件
class Book(APIView): # parser_classes = [FormParser, ] def get(self, request): book_list = models.Book.objects.all() temp = [] for book in book_list: temp.append({"title": book.title, "publish_date": book.publishDate}) # 如果字段较多,不方便 return JsonResponse(temp, safe=False) def post(self, request): print("post") print(request.data) return HttpResponse("ok")
django自带的序列化组件
from django.core.serializers import serialize class Book(APIView): def get(self,request,*args,**kwargs): books = models.Book.objects.all() data = serialize(books,‘json‘) # django自带的序列化组件 return HttpResponse(data)
使用rest_framework的序列化组件
from rest_framework import serializers class BookSerializer(serializers.Serializer): name = serializers.CharField(source=‘name‘) price = serializers.CharField() test = serializers.CharField(source=‘publish.id‘)
视图层使用上面的序列化组件
class Book(APIView): def get(self,request,*args,**kwargs): ret = models.Book.objects.all() book_ser = mySel.BookSerializer(ret,many=True) #many=True表示可以序列化很多条出来 return JsonResponse(book_ser,safe=False)
取出一个字段的两种方法
(1):表里面重写__str__方法 (2):用source,可以指定字段,也可以指定方法 test = serializers.CharField(source=‘publish.id‘) name = serializers.CharField(source=‘name‘)
使用SerializerMethodField
publish = serializers.SerializerMethodField() def get_publish(self,obj): # 这个 obj 是当前类的对象 dic = {‘name‘:obj.publish.name,‘email‘:obj.publish.email} return dic
-使用ModelSerializer
class BookSerializer(serializers.ModelSerializer): class Meta: # 指定表名字 model = Book # 取所有字段 # fields = ‘__all__‘ # 只取 nid,name 字段 fields = [‘nid‘,‘name‘] # 去掉 nid,name 字段 # exclude = [‘publish‘,‘authors‘] # depth指定深度为2,就是最多跨2张表查询 # depth = 2
以上是关于序列化组件的主要内容,如果未能解决你的问题,请参考以下文章