drf-day2——序列化组件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

原文地址:https://www.cnblogs.com/zhangtieshan/p/13270269.html