前提数据库中数据已经搭建完毕
简单使用:
1.写一个序列化的类MySer,继承Serializer
2.在该类中写出所要序列化的字段,字段名相同即可 不同的话可以利用 source参数来引出
3.在视图类中的使用 将数据对象传入即可 book_ser = MySer(instance=book) 最后返回book_ser.data即可
一般来讲 可以先定义一个字典 里面携带msg code data等参数如下
back_dic = {‘code‘:100,‘msg‘:‘成功‘}
默认成功 如果成功 给back_dic[‘data‘] = ‘book_ser.data‘
返回字典即可
如果失败 back_dic[‘data‘] = ‘book_ser.error‘ 并且修改 code 和 msg参数
from rest_frameword import serializers class MySer(serializers.Serilaizer): title1 = serializers.CharField(source=‘title‘) price = serializers.CharField(max_length=16,min_length=4) pub_date = serializers.CharField(source=‘test‘) publish = serializers.CharField(source=‘publish.email‘) # authors = serializers.CharField() authors = serializers.SerializerMethodField()
注意上述括号内可以携带限制参数 ,并且同时也会有类似局部钩子函数和全局钩子函数的使用 其中 括号内的vali‘da‘tors=[check_author] xxx可以是一个函数地址 例如可以限定作者名字开头不能sb等字符、
def check_author(data):
if data.startswith(‘sb‘):
raise ValidationError("名字带有歧义请重新修改")
else:
return data
def validate_price(self, data): # 局部钩子函数 data就是validate后面的值也就是price if float(data) > 10: return data else: raise ValidationError("价格太低") def validate(self, attrs): # attrs是request.data里所传的数据 也就是数据库中的数据 类似于全局钩子函数 print(attrs) author = attrs.get(‘author‘) publish = attrs.get(‘publish‘) if author == publish: raise ValidationError("作者与出版社重复") else: return attrs
对于数据增加和修改 其中所用到的保存 需要在序列化类中重新定义update和create函数
def post(self,request):#新增数据 back_dic = {‘code‘: 1000, ‘msg‘: ‘成功‘} #新增没有instance对象 book_ser = ser.BookSerializer(data = request.data) #book_ser = ser.BookSerializer(request.data)这样写相当将request.data赋值给instance会报错 所以要指出赋值给谁 if book_ser.is_valid(): book_ser.save() back_dic[‘data‘] = book_ser.data else: back_dic[‘code‘] = 1001 back_dic[‘msg‘] = "字段校验失败" back_dic[‘data‘] = book_ser.errors return Response(back_dic)
def put(self,request,pk): #修改数据注意pk参数的传入 规定了我要改哪条数据 back_dic = {‘code‘:1000,‘msg‘:‘成功‘} book = models.Book.objects.filter(pk=pk).first() #book_ser = ser.BookSerializer(book,request.data) book_ser = ser.BookSerializer(instance=book,data=request.data) #要数据验证 if book_ser.is_valid(): book_ser.save() #报错 序列化器的保存方法 需要重写update方法 back_dic[‘data‘] = book_ser.data else: back_dic[‘code‘] = 1001 back_dic[‘msg‘] = "失败" back_dic[‘data‘] = book_ser.errors return Response(back_dic)
#重写update和create方法在序列化类中 def update(self, instance, validated_data): # instance是book这个对象 # validated_data是校验后的数据 instance.name = validated_data.get(‘name‘) instance.price = validated_data.get(‘price‘) instance.author = validated_data.get(‘author‘) instance.publish = validated_data.get(‘publish‘) instance.save() # book.save() 是django ormtigo1的 return instance def create(self, validated_data): instance = models.Book.objects.create(**validated_data)#打散刚好是所要创建的各种参数 #models.Book.objects.create(name=validated_data.get[‘name‘],price=validated_data.get[‘price‘]....) return instance
ModelSerializer的使用Serializer基本相似 略微不同 不需要重写update和create方法
创建序列化类时如下
class BookModelSerializer(serializers.ModelSerializer): class Meta: model = models.Book fields = ‘__all__‘ # fields = (‘name‘,‘price‘) #只看name和price字段 # exclude = [‘price‘,‘author‘] #后面必须是列表 # read_only_fields = [‘price‘] #write_only_fields = [‘price‘]#该字段被弃用了 extra_kwargs = {#类似于name = serializers.CharField(max_length=16, min_length=4) 括号里所携带的参数 ‘id‘:{‘write_only‘:True,‘read_only‘:False}, }
对于输出authors字段时直接是无法展示全面的信息 所以要进行以下操作
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 #return什么东西 就取到什么东西
同时需要记住的是 source参数的使用