模型类序列化器的使用

新建一个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':'删除成功'})

 

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

class BooksGeneriAll(GenericAPIView):
    # 傻逼了,,在函数内部就是自己定义的了,,,
    queryset = Book.objects
    serializer_class = myserializersmod.BookModelSerializer

    def get(self, request, *args, **kwargs):
        response_msg = {'status': 100, 'msg': '成功'}
        book = self.get_queryset()
        book_ser = self.get_serializer(instance=book, many=True)
        #在data中点all了
        response_msg['data'] = book_ser.data
        return Response(response_msg)

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

        book_ser = self.get_serializer(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)


# 模块GenericAPIView的方式
# 查询单个
class BooksGeneri(GenericAPIView):
    queryset = Book.objects
    serializer_class = myserializersmod.BookModelSerializer

    def get_serializer_class(self):
         return  myserializersmod.BookModelSerializer

    def get(self, request,*args, **kwargs):
        pk = kwargs.get('pk')
        book = self.get_object()
        book_ser = self.get_serializer(instance=book)
        return Response(book_ser.data)

    # 修改
    def put(self, request, *args, **kwargs):
        response_msg = {'status': 100, 'msg': '成功'}
        # 找到这个对象
        pk = kwargs.get('pk')
        book = self.get_object()
        # 得到一个序列化类的对象
        # boo_ser=BookSerializer(book,request.data)
        boo_ser = self.get_serializer(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': '删除成功'})

#继承了mixins.ListModelMixin,GenericAPIView
#ListModelMixin 实现多个查询的类
#GenericAPIView 实现通用写法需要的类
class BoosListView(ListAPIView):
    queryset = Book.objects
    serializer_class = myserializersmod.BookModelSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

#继承了mixins.ListModelMixin,GenericAPIView
#RetrieveModelMixin 实现单个查询的类
#GenericAPIView 实现通用写法需要的类
class BookRetrieveView(RetrieveAPIView):
    queryset = Book.objects
    serializer_class = myserializersmod.BookModelSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)



from app01.myUserRateThrottle import MyThrottles, MyUserThrottle

#全部继承了,配置好后所以的查询都可以走这里
class BookModelViewSet(ModelViewSet):
    # authentication_classes = [MyAuthentication]
    permission_classes = []
    # throttle_classes = [MyUserThrottle]
    queryset = Book.objects
    serializer_class = myserializersmod.BookModelSerializer

  

posted @ 2022-03-18 21:48  咖喱给给啊  阅读(31)  评论(0)    收藏  举报