一 restframwork为我们提供了一个快速实例,方便我们快速理解restframwork的序列化的原理。
二 restframwork序列化
开发我们的Web API(应用程序接口)的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json
之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。
1 首先创建一个序列化类
1 models部分:
from django.db import models # Create your models here. class Book(models.Model): title=models.CharField(max_length=32) price=models.IntegerField() pub_date=models.DateField() publish=models.ForeignKey("Publish") authors=models.ManyToManyField("Author") def __str__(self): return self.title class Publish(models.Model): name=models.CharField(max_length=32) email=models.EmailField() def __str__(self): return self.name class Author(models.Model): name=models.CharField(max_length=32) age=models.IntegerField() def __str__(self): return self.name
2 view部分:
from rest_framework.views import APIView from rest_framework.response import Response from .models import * from django.shortcuts import HttpResponse from django.core import serializers from rest_framework import serializers class BookSerializers(serializers.Serializer): title=serializers.CharField(max_length=32) price=serializers.IntegerField() pub_date=serializers.DateField()
## 对于多对一的字段我们需要添加source=“publish.name” 从而取到我们对应模型类中的字段,而不是显示关联的id。 publish=serializers.CharField(source="publish.name") #authors=serializers.CharField(source="authors.all")
### 那么对于多对多的字段我们需要自定义一个方法,来拿到对应模型类model中的所有字段,显示出来。 authors=serializers.SerializerMethodField() def get_authors(self,obj): # 其中obj为当前模型类Book的对象。 temp=[] for author in obj.authors.all(): temp.append(author.name) # 将author的名字添加到一个列表中。 return temp class BookViewSet(APIView): def get(self,request,*args,**kwargs): book_list=Book.objects.all() # 序列化方式1: # from django.forms.models import model_to_dict # import json # data=[] # for obj in book_list: # data.append(model_to_dict(obj)) # print(data) # return HttpResponse("ok") # 序列化方式2: # data=serializers.serialize("json",book_list) # return HttpResponse(data) # 序列化方式3: bs=BookSerializers(book_list,many=True) return Response(bs.data)
以上三种序列化的方式:
第一种使用的还是django的序列化方式。
第二,三种则是使用restframwork的方式。
3 ModelSerializer:
class BookSerializers(serializers.ModelSerializer): class Meta: model=Book fields="__all__"
exclude=(‘nid’,)
depth=1
4 提交post的请求:
复制代码 def post(self,request,*args,**kwargs): bs=BookSerializers(data=request.data,many=False) if bs.is_valid(): # print(bs.validated_data) bs.save() return Response(bs.data) else: return HttpResponse(bs.errors)