ListSerializer类:群增 群改
数据层:还是采用Book、Publish、Author、AuthorDetail四个Model类
序列化层:
from rest_framework import serializers
from . import models
# 利用 ListSerializer 类完成群增群改
class BooksListSerializer(serializers.ListSerializer):
# ListSerializer已提供create的实现体,有特殊需求可以重写
def create(self, validated_data):
# print('>>>', validated_data)
return super().create(validated_data)
# ListSerializer未提供update的实现体,必须重写
def update(self, instance, validated_data):
# print('***', instance, validated_data)
for index, book_obj in enumerate(instance):
book_dic = validated_data[index] # type: dict
for k, v in book_dic.items():
if hasattr(book_obj, k):
setattr(book_obj, k, v)
# 同步到数据库
book_obj.save()
# print("+++", instance)
return instance
class BooksModelSerializer(serializers.ModelSerializer):
class Meta:
# 设置群体资源校验类
list_serializer_class = BooksListSerializer
# 关联的Model类
model = models.Book
fields = ('name', 'price', 'publish', 'authors')
extra_kwargs = {
'publish': {
'write_only': True
},
'authors': {
'write_only': True
},
'price': {
# 数据库字段设置了默认值,也需要 反序列化 时必须提供该字段
'required': True,
'error_messages': {
'required': '价格不能为空',
}
},
'name': {
'min_length': 3,
'error_messages': {
'min_length': '太短',
}
},
}
def validate_name(self, value: str):
# 拿视图类传递过来的参数
# print(self.context.get('owner'))
if not value.isidentifier():
raise serializers.ValidationError('名字非法')
return value
def validate(self, attrs):
# 同一出版社书面相同,代表书是同一本,不存入数据库
name = attrs.get('name')
publish = attrs.get('publish')
# print(name, type(name))
# print(publish, type(publish))
if models.Book.objects.filter(name=name, publish=publish):
raise serializers.ValidationError({'%s' % name: '已存在'})
return attrs
视图层
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from . import models, serializers
from utils.response import APIResponse
class BooksAPIView(APIView):
# 获取所有 | 一个
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
books_query = models.Book.objects.filter(is_delete=False, pk=pk)
else:
books_query = models.Book.objects.filter(is_delete=False).order_by('id')
books_data = serializers.BooksModelSerializer(books_query, many=True).data
return APIResponse(0, 'ok', books_data)
# 新增多个 | 一个
def post(self, request, *args, **kwargs):
request_data = request.data
# if isinstance(request_data, list): # 群增
# many = True
# else: # 单增
# many = False
many = True if isinstance(request_data, list) else False
book_ser = serializers.BooksModelSerializer(data=request_data, many=many)
if book_ser.is_valid():
book_obj_list = book_ser.save()
return APIResponse(0, 'ok', serializers.BooksModelSerializer(book_obj_list, many=many).data)
else:
return APIResponse(1, 'failed', book_ser.errors)
# 修改一个
def put(self, request, *args, **kwargs):
pk = kwargs.get('pk', 1)
book_obj = models.Book.objects.filter(pk=pk, is_delete=False).first()
book_ser = serializers.BooksModelSerializer(instance=book_obj, data=request.data)
if book_ser.is_valid():
book_obj = book_ser.save()
return Response({
'status': 0,
'msg': 'ok',
'results': serializers.BooksModelSerializer(book_obj).data
})
else:
return Response({
'status': 1,
'msg': 'failed',
'results': book_ser.errors
})
# 局部修改多个 | 一个
"""
def patch(self, request, *args, **kwargs):
request_data = request.data
many = True if isinstance(request_data, list) else False
if many: # 群改