当前位置: 移动技术网 > IT编程>脚本编程>Python > drf框架serializers中ModelSerializer类简化序列化和反序列化操作

drf框架serializers中ModelSerializer类简化序列化和反序列化操作

2019年09月06日  | 移动技术网IT编程  | 我要评论

中国轻纺城网上交易市场,德惠供求世界,彼岸花盛开之夜动漫

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  # 跨表自动深度(展示外键表的所有字段)

注意点

  • 其中fieldsexclude不能共存
  • depth不能控制显示字段,与外键相关的表会全部显示出来

二.利用模型类中的方法进行指导字典的生成

例如有两个模型ab,他们的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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网