第五十章:djangoframework 3

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: # 群改

转载于:https://www.cnblogs.com/haojunliancheng/p/11378421.html

你可能感兴趣的:(数据库)