序列化器Serializer + 反序列化 + 局部 全局 函数钩子 + APIview(五大接口 增删改单群查) + ModelSerializer +自己封装的response


# utils.py # 自己封装的response 未继承 Response class APIResponse(): def __init__(self): self.msg = '成功' self.code = 100 @property def get_dic(self): return self.__dict__ models.py from django.db import models class Book(models.Model): auth = models.CharField(max_length=32) publish = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) add = models.CharField(max_length=32) # url.py from django.contrib import admin from django.urls import path, re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls),
# 单查 put re_path(r'books/(?P<pk>\d+)', views.BookView.as_view()),
# BookModelSerializerView -- put re_path(r'book/(?P<pk>\d+)', views.BookModelSerializerView.as_view()),
# 群查 post path(r'books/', views.BooksView.as_view()), ] view.py ''' 一: 序列化器的使用 二: 反序列化器的使用 三: put 四: delete 一: 群查 many=Ture post 删除 自己的 response 二: ModelSerializer 三: serializer高级使用 四: source三种用法 ''' from django.shortcuts import render from rest_framework.views import APIView from rest_framework.response import Response from . import utils from . import models from . import serializer dic = { 'code': '100', 'msg': '', } class BookView(APIView): # 单查 def get(self, request, pk):
     # 查询到当前pk值得book对象 book = models.Book.objects.filter(pk=pk).first()
     # 把当前pk得book 序列化 book_ser = serializer.BookSerializer(instance=book) dic['code'] = '100' dic['msg'] = '成功' dic['data'] = book_ser.data
     # 序列化成功以后会返回序列化数据 既 boook_ser.data return Response(data=dic) # 修改 def put(self, request, pk): # 查询到当前想要修改的对象 book = models.Book.objects.filter(pk=pk).first() # 实例化对象 instance--将要修改的对象 data----修改的数据 由前端传过来 book_ser = serializer.BookSerializer(instance=book, data=request.data)
      # 是否校验成功 if book_ser.is_valid(): # book_ser-- 校验后的数据
       # 保存校验完成的数据 book_ser.save() dic['code'] = '100' dic['msg'] = '成功' dic['data'] = book_ser.data else: dic['code'] = '0' dic['msg'] = '失败' dic['data'] = book_ser.errors return Response(data=dic) def delete(self, request, pk): models.Book.objects.filter(pk=pk).delete() dic['code'] = '100' dic['msg'] = '成功' return Response(data=dic) class BooksView(APIView): # 群查接口--API def get(self, request):
     books = models.Book.objects.all()
    # many 群查的标准 有many去控制生成的对象 books_serializer = serializer.BookSerializer(books, many=True) dic['code'] = '100' dic['msg'] = '成功' dic['data'] = books_serializer.data return Response(data=dic) # # 增加 # def post(self, request): # book_serializer = serializer.BookSerializer(data=request.data) # if book_serializer.is_valid(): # book_serializer.save() # response = APIResponse() # dic['code'] = '100' # dic['msg'] = '成功' # dic['data'] = book_serializer.data # else: # dic['code'] = '0' # dic['msg'] = '失败' # dic['data'] = book_serializer.errors # return Response(data=dic) # 增加 def post(self, request): book_serializer = serializer.BookSerializer(data=request.data) if book_serializer.is_valid(): book_serializer.save() response = utils.APIResponse() response.data = book_serializer.data else: response = utils.APIResponse() response.msg = '失败' response.code = 0 response.data = book_serializer.errors return Response(data=response.get_dic) class BookModelSerializerView(APIView): def put(self, request, pk): books = models.Book.objects.filter(pk=pk).first() bms = serializer.BookModelSerializer(instance=books, data=request.data) if bms.is_valid(): bms.save() response = utils.APIResponse() response.data = bms.data else: response = utils.APIResponse() response.code = 0 response.msg = '失败' response.data = bms.errors return Response(response.get_dic) serializer.py from rest_framework import serializers from rest_framework.exceptions import ValidationError from . import models def check_publish(data): if data.endswith('sb') or data.startswith('sb'): raise ValidationError('出版社不能出现sb或带有歧义的字符') return data class BookSerializer(serializers.Serializer): id = serializers.CharField(read_only=True) publish = serializers.CharField(min_length=2, validators=[check_publish]) # publish = serializers.CharField(min_length=2) price = serializers.CharField() add = serializers.CharField()   # 局部钩子 validate_字段名 data --- 字段(想要检验的字段名) def validate_price(self, data): if float(data) < 0: raise ValidationError('图书价格不可以低于0') return data   # 全局钩子 attrs -- 想要序列化和反序列化的数据 是一个字典 def validate(self, attrs): publish = attrs.get('publish') add = attrs.get('add') if publish == add: raise ValidationError('图书出版社不能和地址相同') return attrs   # 继承APIView 如果是put方法的话 需要重写update instance--book对象 validate_data ---想要修改的数据 def update(self, instance, validated_data): ''' :param instance: book对象 :param validated_data: 修改的数据 request。data :return: instance ''' instance.publish = validated_data.get('publish') instance.price = validated_data.get('price') instance.add = validated_data.get('add') instance.save() return instance # 继承APIView 如果是post 需要重写create方法 def create(self, validated_data): instance = models.Book.objects.create(**validated_data) return instance # 序列化器继承 ModelSerializer 对于post put 将不需要重写update create class BookModelSerializer(serializers.ModelSerializer): class Meta: model = models.Book # fields = '__all__' fields = ['price', 'add'] extra_kwargs = { 'add': {'max_length': 8} } def validate_price(self, data): if float(data) < 0: raise ValidationError('图书价格不可以低于0') return data

  

posted @ 2021-05-19 23:36  mofr  阅读(87)  评论(0)    收藏  举报