drf框架serializers中ModelSerializer类简化序列化和反序列化操作
程序员文章站
2022-10-09 13:48:39
0905自我总结 drf框架serializers中ModelSerializer类 https://www.cnblogs.com/pythonywy/p/11455508.html 一.简单的使用 导入 注意点 其中 与`exclude`不能共存 不能控制显示字段,与外键相关的表会全部显示出来 ......
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
上一篇: 血小板低吃什么补得快的食物大推荐