简单的drf操作流程序列化操作

前提数据库中数据已经搭建完毕

简单使用:
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参数的使用 

 

简单的drf操作流程序列化操作

上一篇:IIS新建虚拟目录


下一篇:大数据生态--knox配置代理大数据组件(一)