模型类序列化器的使用


新建一个py文件,代码如下

from rest_framework import serializers

from app01.models import Book


class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book  # 对应上models.py中的模型
        fields = '__all__'
        # fields=('name','price','id','author') # 只序列化指定的字段
        # exclude=('name',) #跟fields不能都写,写谁,就表示排除谁
        # read_only_fields=('price',)
        # write_only_fields=('id',) #弃用了,使用extra_kwargs
        extra_kwargs = {  # 类似于这种形式name=serializers.CharField(max_length=16,min_length=4)
            'price': {'write_only': True},
        }

# 其他使用一模一样
# 不需要重写create和updata方法了

view中的代码

class BooksModAll(APIView):
    def get(self,*args,**kwargs):
        response_msg = {'status': 100, 'msg': '成功'}
        book = Book.objects.all()
        book_ser = myserializersmod.BookModelSerializer(instance=book,many=True)
        response_msg['data'] = book_ser.data
        return Response(response_msg)

    def post(self,request,*args,**kwargs):
        response_msg = {'status': 100, 'msg': '成功'}

        book_ser = myserializersmod.BookModelSerializer(data=request.data)
        if not book_ser.is_valid():
            response_msg['status'] = 101
            response_msg['msg'] = '增加数据失败'
            response_msg['err'] = book_ser.errors
            return Response(response_msg)
        book_ser.save()
        response_msg['date'] = book_ser.data
        return Response(response_msg)

class BooksMod(APIView):
    def get(self,*args,**kwargs):
        pk = kwargs.get('pk')
        book = Book.objects.filter(id=pk).first()
        book_ser = myserializersmod.BookModelSerializer(instance=book)
        return Response(book_ser.data)
    #修改
    def put(self,request,*args,**kwargs):
        response_msg = {'status': 100, 'msg': '成功'}
        # 找到这个对象
        pk = kwargs.get('pk')
        book = Book.objects.filter(id=pk).first()
        # 得到一个序列化类的对象
        # boo_ser=BookSerializer(book,request.data)
        boo_ser = myserializersmod.BookModelSerializer(instance=book, data=request.data)

        # 要数据验证(回想form表单的验证)
        if boo_ser.is_valid():  # 返回True表示验证通过
            boo_ser.save()  # 报错
            response_msg['data'] = boo_ser.data
        else:
            response_msg['status'] = 101
            response_msg['msg'] = '数据校验失败'
            response_msg['data'] = boo_ser.errors

        return Response(response_msg)

    def delete(self,*args,**kwargs):
        pk = kwargs.get('pk')
        ret=Book.objects.filter(pk=pk).delete()
        return Response({'status':100,'msg':'删除成功'})

这么写就轻松多了,下面还有更加简单的写法,但是把难的写一遍,印象就更深刻