drf框架serializers中ModelSerializer类简化序列化和反序列化操作
0905自我总结
drf框架serializers中ModelSerializer类
基于seriallizer类进行简化
https://www.cnblogs.com/pythonywy/p/11455508.html
一.简单的使用
导入from rest_framework import serializers
与基础serializer类后续使用的作用相似
class 自定义名称(serializers.ModelSerializer):
class Meta:
model=对应的模型
fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
#fields='__all__' 为所有字段
# exclude = ('id', 'is_delete') # 刨除某些字段
# depth = 1 # 跨表自动深度(展示外键表的所有字段)
注意点
- 其中
fields
与exclude
不能共存 depth
不能控制显示字段,与外键相关的表会全部显示出来
二.利用模型类中的方法进行指导字典的生成
例如有两个模型A
与B
,他们的c字段有外键关联
modles.py
class B(models.Model):
name = models.CharField(max_length=60)
class A(models.Model):
uid = models.ForeignKey(B,'id')
@property #下面调用函数名的时候自动运行函数
def b_name(self): #这里的self是A类
return self.uid.name
class AModelSerializer(serializers.ModelSerializer):
class Meta:
model=A #这里导入A会把A里面的所有名称空间存在的都进行导入
fields=('b_name')
三.另外总方法完成深度查询
class B(models.Model):
name = models.CharField(max_length=60)
class A(models.Model):
uid = models.ForeignKey(B,'id')
#方法一
class BModelSerializer(serializers.ModelSerializer):
class Meta:
model=B
fields=('b_name')
class BModelSerializer(serializers.ModelSerializer):
b_name = BModelSerializer()
class Meta:
model=A #这里导入A会把A里面的所有名称空间存在的都进行导入
fields=('b_name')
#方法二
#通过自定义字段
class BModelSerializer(serializers.ModelSerializer):
b_name = serializers.SerializerMethodField()
def get_b_name(self, obj: models.A):
return A.uid.name
class Meta:
model=A #这里导入A会把A里面的所有名称空间存在的都进行导入
fields=('b_name')
四.ModelSerializer对于反序列话约数条件设置及只读只写属性设置
反序列话约数条件设置
class 自定义名称(serializers.ModelSerializer):
class Meta:
model=对应的模型
fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
extra_kwargs ={
参与序列化和反序列的字段1:{
'required': True, #必须填写的字段
'min_length': 3,
#.....约数条件
'error_messages': {
'min_length': '太短'
}
}
}
只读只写属性设置
class 自定义名称(serializers.ModelSerializer):
class Meta:
model=对应的模型
fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
extra_kwargs ={
参与序列化和反序列的字段1:{
'write_only': True #只写
}
参与序列化和反序列的字段2:{
'read_only': True #只读
}
}
五.视图层使用
数据没有修改
class BookAPIView(APIView):
def get(self, request, *args, **kwargs):
book_query = models.Book.objects.all() #假设查我们定义的书的这个模型
book_ser = serializers.BookModelSerializer(book_query, many=True)
return Response(0, 'ok', results=book_ser.data) #用drf框架自带的Response
有添加修改相关操作
class BookAPIView(APIView):
def post(self, request, *args, **kwargs):
pk=kwargs.get('pk')
book_obj = models.Book.objects.get('pk')
book_ser = serializers.BookModelSerializer(instance=book_obj,data=request.data) #根据传进来的数据机芯判断
#如果多个数据为book_set = serializers.BookModelSerializer(data=request.data many=true)
if book_ser.is_valid(): #这里是我们设置的ModelSerializer的约数条件看是否能通过
book_ser.save() #这里他会自动进行判断是create方法还是update方法
return Response(0, 'ok',results=book_ser.data)
else:
return Response(1, '添加失败', results=book_ser.errors)#用drf框架自带的Response
注意点
:save源码中我们可以看到instance
有值调用updata方法,没有值调用create方法.所以修改必须加instance参数,传的参数基本上是修改之前的对象
有关删除
class BookAPIView(APIView):
def post(self, request, *args, **kwargs):
book_ser = serializers.BookModelSerializer(data=request.data) #根据传进来的数据机芯判断
#如果多个数据为book_set = serializers.BookModelSerializer(data=request.data many=true)
if book_ser.is_valid(): #这里是我们设置的ModelSerializer的约数条件看是否能通过
book_ser.deleter() #这里他会自动进行判断是create方法还是update方法
return Response(0, 'ok',results=book_ser.data)
else:
return Response(1, '删除失败', results=book_ser.errors)#用drf框架自带的Response