笔记: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:
一:
二:
三:
POST:
一:
二:
DELETE:
一:
二:
三:http://127.0.0.1:8000/books/
PUT:
一:
二:
PATCH:
一: