zoukankan      html  css  js  c++  java
  • drfday2——序列化组件serializer

    笔记:http://www.liuqingzheng.top/python/Django-rest-framework框架/2-drf-序列化组件/

    作业:

    1 图书的5个接口写完(使用序列化组件)

    # 路由:
    urlpatterns = [
        url(r'^books/(?P<pk>\d+)', views.BookView.as_view()),
        url(r'^books/', views.BookView.as_view()),
    ]
    
    
    
    # 模型表:
    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8, decimal_places=2)
        publish = models.ForeignKey('Publish', on_delete=models.CASCADE, null=True)
        authors = models.ManyToManyField('Author')
    
        def __str__(self):
            return self.title
    
    
    class Publish(models.Model):
        name = models.CharField(max_length=16)
    
    
    class Author(models.Model):
        name = models.CharField(max_length=10)
        age = models.IntegerField()
    
        def __str__(self):
            return self.name
    
        
        
    # 使用序列化组件自定义序列化器:
    from rest_framework import serializers
    from app01.models import Book
    from rest_framework.exceptions import ValidationError
    
    
    class BookSerializer(serializers.Serializer):
        shuming = serializers.CharField(max_length=9, min_length=2, required=True, source='title')
        price = serializers.DecimalField(max_digits=8, decimal_places=2)
        publish = serializers.CharField(source='publish.name', read_only=True)
        authors_id = serializers.ListField(write_only=True)
        publish_id = serializers.IntegerField(write_only=True)
    
        def create(self, validated_data):
            title = validated_data.get('title')
            price = validated_data.get('price')
            publish_id = validated_data.get('publish_id')
            authors_id_list = validated_data.get('authors_id')
            instance = Book.objects.create(title=title,
                                           price=price,
                                           publish_id=publish_id)
            author_id1 = int(authors_id_list[0])
            author_id2 = int(authors_id_list[1])
            instance.authors.add(author_id1, author_id2)
            return instance
    
        def update(self, instance, validated_data):
            instance.title = validated_data.get('title')
            instance.price = validated_data.get('price')
            instance.publish_id = validated_data.get('publish_id')
            instance.save()
            return instance
    
        def validate_authors_id(self, data):
            print(data)
            for i in data:
                if int(i) not in (1, 2):
                    raise ValidationError('上传的主键没有对应的作者')
            return data
    
        def validate_publish_id(self, data):
            if data not in (1, 2):
                raise ValidationError('上传的主键没有对应的出版社')
            return data
     
    
    # 视图:
    from django.shortcuts import render
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from app01.models import Book
    from app01.ser import BookSerializer
    from app01.utils import MyResponse
    
    
    class BookView(APIView):
        def get(self, request, pk=None):
            response = MyResponse()
            if not pk:
                books = Book.objects.all()
                books_ser = BookSerializer(books, many=True)
                response.data = books_ser.data
                return Response(response.get_dict)
            else:
                book = Book.objects.filter(pk=pk)
                if not book:
                    response.status = 101
                    response.msg = f'不存在主键值为{pk}书籍 '
                    return Response(response.get_dict)
                book_ser = BookSerializer(book.first())
                response.data = book_ser.data
                return Response(response.get_dict)
    
        def post(self, request):
            response = MyResponse()
            book_ser = BookSerializer(data=request.data)
            if book_ser.is_valid():
                book_ser.save()
                response.data = book_ser.data
            else:
                response.status = 102
                response.msg = '数据校验失败'
                response.data = book_ser.errors
            return Response(response.get_dict)
    
        def delete(self, request, pk=None):
            response = MyResponse()
            if not pk:
                Book.objects.all().delete()
                response.msg = '所有数据数据已删除'
                return Response(response.get_dict)
            else:
                book = Book.objects.filter(pk=pk)
                if not book:
                    response.status = 103
                    response.msg = f'不存在主键值为{pk}书籍,无法删除 '
                    return Response(response.get_dict)
                book.delete()
                response.msg = f'主键值为{pk}书籍,已删除 '
                return Response(response.get_dict)
    
        def put(self, request, pk):
            response = MyResponse()
            if not pk:
                response.status = 104
                response.msg = '没有提交数据的主键无法修改'
                return Response(response.get_dict)
            else:
                book = Book.objects.filter(pk=pk)
                if not book:
                    response.status = 105
                    response.msg = f'不存在主键值为{pk}书籍,无法修改 '
                    return Response(response.get_dict)
                book_ser = BookSerializer(instance=book.first(), data=request.data)
                if book_ser.is_valid():
                    book_ser.save()
                    response.data = book_ser.data
                    return Response(response.get_dict)
                else:
                    response.status = 106
                    response.msg = f'数据校验失败 '
                    return Response(response.get_dict)
    
        def patch(self, request, pk):
            response = MyResponse()
            if not pk:
                response.status = 107
                response.msg = '没有提交数据的主键无法进行修改'
                return Response(response.get_dict)
            else:
                book = Book.objects.filter(pk=pk)
                if not book:
                    response.status = 108
                    response.msg = f'不存在主键值为{pk}书籍,无法进行修改 '
                    return Response(response.get_dict)
                book_ser = BookSerializer(instance=book.first(), data=request.data)
                if book_ser.is_valid():
                    book_ser.save()
                    response.data = book_ser.data
                    return Response(response.get_dict)
                else:
                    response.status = 109
                    response.msg = f'数据校验失败 '
                    return Response(response.get_dict)
                
                
                
    # from app01.utils import MyResponse  utils.py内容:
    class MyResponse():
        def __init__(self):
            self.status = 100
            self.msg = '成功'
    
        @property
        def get_dict(self):
            return self.__dict__
        
        
    
    

    GET:

    一:

    image-20200709000955964

    二:

    image-20200709001056563

    三:

    image-20200709001212175

    POST:

    一:

    image-20200709001508437

    二:

    image-20200709001650631

    DELETE:

    一:

    image-20200709001806881

    二:

    image-20200709001828862

    三:http://127.0.0.1:8000/books/

    PUT:

    一:

    image-20200709011118212

    二:

    image-20200709011223280

    PATCH:

    一:

    image-20200709012143109

  • 相关阅读:
    update condition 字段报错
    Xshell连接Linux服务器总掉线
    sleep php函数
    ubuntu 16.04 镜像下载
    多线程Parallel和Task
    AngularJS 时间格式化
    正则表达式
    手机抓包
    内存泄漏
    字符集编码和排列规则
  • 原文地址:https://www.cnblogs.com/cainiaoqianxun/p/13270269.html
Copyright © 2011-2022 走看看