首先,因为我们安装了restframework,所以我们需要在django的settings中引入restframework
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app1.apps.App1Config', "rest_framework", ]
然后我们在使用cbv的方式进行多表的序列化
from rest_framework.views import APIView class Book_cbv(APIView): def get(self,request): query_list = models.Book.objects.all() bs = book_serializers(query_list,many=True) from rest_framework.response import Response # return HttpResponse(bs.data) return Response(bs.data) def post(self,request): pass
这里要注意,我们的cbv这次是继承的rest_framework的APIView
这里为了返回的数据好看一些,我们导入了rest_framework的Response模块
from rest_framework.response import Response # return HttpResponse(bs.data) return Response(bs.data)
到此,我们现在和单表的序列化还是一样的,下面我们进入多表的序列化
首先看下序列化的类是怎么写的
class book_serializers(serializers.Serializer): id = serializers.IntegerField() book_name = serializers.CharField() book_price = serializers.DecimalField(max_digits=5,decimal_places=2) # 一对多,关联指定的对象,然后显示指定对象的字段 book_publish = serializers.CharField(source="book_publish.id") book_auther = serializers.SerializerMethodField() def get_book_auther(self,obj): s = "" for i in obj.book_auther.all(): s = s + i.auther_name + "|" return s
首先看下一对多的字段,这里的意思是source这个字段代表我要显示一对多中的一表要显示的信息
# 一对多,关联指定的对象,然后显示指定对象的字段 book_publish = serializers.CharField(source="book_publish.id")
最后看下多对多字段该如何处理
book_auther = serializers.SerializerMethodField() def get_book_auther(self,obj): s = "" for i in obj.book_auther.all(): s = s + i.auther_name + "|" return s
重点看下我截图的位置,多对多字段要使用serializers.SerializerMethodField这个方法
下面我们来解释一下下面的函数,首先get_后面的book_auther这个就是多对多字段,传递的obj这个就是book这个model对象,多对多字段具体要显示什么,完全取决于get_book_auther这个函数的返回值
下面我们通过postman发送get请求,看下返回值
我们看到一对多字段是显示的一表中的id,多对多字段也是按照我们的函数的返回值进行显示的
至此,单表的序列化,一对多字段的序列化,多对多字段的序列化都已经完成了