标签:提交 一个 block api any pre save meta date
serializers 序列化组件
可以实现很轻松的互相转换,最常用的组件 ,用量最大的组件
源码位置
rest_framework.serializers
源码中需要用到的
rest_framework.serializers
# 序列化工具类必须要继承此类 class ModelSerializer(Serializer):
转换命令
queryset/对象 -----> 序列化数据
bs=BookModelSerializers(queryset,many=True) # 对queryset 对象序列化 bs=BookModelSerializers(obj) # 对 对象序列化
序列化数据 -----> queryset
bs=BookModelSerializers(data=request.data) # 将序列化数据 转换成对象
数据校验
bs.is_valid()
数据提交转换成记录
# 不指定对象.create() 方法 bs=BookModelSerializers(data=request.data) # 指定对象.updata() 方法 bs=BookModelSerializers(book,data=request.data) bs.save()
实例
序列化模块工具类
建立model字段的映射
自定义 oto fk mtm 字段
from rest_framework.response import Response from rest_framework import serializers class BookModelSerializers(serializers.ModelSerializer): # 类似于 modelform 一样的操作 class Meta: model = Book fields = "__all__" # fields = [‘publist‘,‘authors‘,‘title‘,] # 也可以单独取部分字段 # 默认转换的时候普通字段没啥问题 # title = serializers.CharField # 对于普通字段直接取即可 默认是 取 str(obj.title ) # 对于一对一,一对多字段会有错误的显示 # publish= serializers.CharField() # 会显示对象 # publish_id = serializers.CharField() # 会显示id # 自定义对一对多字段处理 publish = serializers.CharField(source="publish.pk") # 加 "source=" 取 str(obj.publish.pk ) # 给字段的赋值一个 url 地址 publish=serializers.HyperlinkedIdentityField( view_name="detailpublish", # 反向解析的 别名 lookup_field="publish_id", # 找出来当前的 id 值 lookup_url_kwarg="pk" # 将lookup_field 的值赋值给 url 中 ) # authors = serializers.SerializerMethodField(source=‘authors.all‘) # 这样查多对多会查出来 queryset 对象 # 自定义对多对多字段的处理 authors = serializers.SerializerMethodField() def get_authors(self,obj): # 自定义多对多的处理 temp=[] for obj in obj.authors.all(): temp.append(obj.name) return temp # 如果自定义了字段的处理 ,需要重写 create 方法 def create(self, validated_data): book=Book.objects.create(title=validated_data["title"],price=validated_data["price"],pub_date=validated_data["pub_date"],publish_id=validated_data["publish"]["pk"]) book.authors.add(*validated_data["authors"]) return book
序列化使用
class BookView(APIView): def get(self,request): # 对所有数据进行查看 book_list=Book.objects.all() bs=BookModelSerializers(book_list,many=True,context={‘request‘: request}) return Response(bs.data) def post(self,request): # 对数据进行创建提交 # post请求的数据 bs=BookModelSerializers(data=request.data) if bs.is_valid(): print(bs.validated_data) bs.save() # .create()方法 return Response(bs.data) else: return Response(bs.errors) class BookDetailView(APIView): def get(self,request,id): # 对单条数据进行查看 book=Book.objects.filter(pk=id).first() bs=BookModelSerializers(book,context={‘request‘: request}) return Response(bs.data) def put(self,request,id): # 对单条数据进行更新 book=Book.objects.filter(pk=id).first() bs=BookModelSerializers(book,data=request.data) if bs.is_valid(): bs.save() # .updata() return Response(bs.data) else: return Response(bs.errors) def delete(self,request,id): # 删除数据 Book.objects.filter(pk=id).delete() return Response()
标签:提交 一个 block api any pre save meta date
原文地址:https://www.cnblogs.com/shijieli/p/10273584.html