python drf 序列化器之数据的增删改查(详细)

#url.py

from django.contrib import admin
from django.urls import path, re_path
from app_drf_books import views

urlpatterns = [
   path('admin/', admin.site.urls),
   path('books/', views.BooksAPIView.as_view()),
   re_path('books/(?P<pk>\d+)', views.BookAPIView.as_view())
]

#utils.py 自定义工具类
class MyResponse():
   def __init__(self):
       self.code = 100
       self.msg = 'OK'

   @property
   def dict(self):
       return self.__dict__

#模型类models.py
from django.db import models


# Create your models here.


class Books(models.Model):
   title = models.CharField(max_length=32)
   price = models.DecimalField(max_digits=5, decimal_places=2)
   author = models.CharField(max_length=32)
   publish = models.CharField(max_length=32)
   
#ser.py 序列化器
from rest_framework import serializers
from app_drf_books import models
from rest_framework.exceptions import ValidationError


class BookSerializers(serializers.Serializer):
   id = serializers.CharField(read_only=True)
   title = serializers.CharField()
   price = serializers.CharField()
   author = serializers.CharField()
   publish = serializers.CharField()

   def update(self, instance, validated_data):
       instance.title = validated_data.get('title')
       instance.price = validated_data.get('price')
       instance.author = validated_data.get('author')
       instance.publish = validated_data.get('publish')
       instance.save()
       return instance

   def create(self, validated_data):
       result = models.Books.objects.create(**validated_data)
       return result

   def validate_title(self, data):
       if 'small baby' in data:
           raise ValidationError('书名中不能有敏感字眼哦')
       else:
           return data

   def validate_price(self, data):
       if float(data) >= 200:
           raise ValidationError('奸商啊,卖那么贵,不让你卖,气死你')
       else:
           return data

#view.py 视图函数,CBV模式
from rest_framework.views import APIView
from app_drf_books import models
from app_drf_books.ser import BookSerializers
from app_drf_books import utils
from rest_framework.response import Response


# Create your views here.


# 单本书籍的查,改,删
class BookAPIView(APIView):
   def get(self, request, pk):  # 单本书籍的查询
       response_dic = utils.MyResponse()  # 实例化自定义工具类中的response类
       book = models.Books.objects.filter(pk=pk).first()  # 获取当前查询图书对象
       book_ser = BookSerializers(instance=book)  # 实例化自定义序列化器
       response_dic.data = book_ser.data  # 将数据传入
       return Response(response_dic.dict)

   def put(self, request, pk):  # 单本书籍的修改
       response_dic = utils.MyResponse()  # 实例化自定义类
       book = models.Books.objects.filter(pk=pk).first()  # 获取要修改的书籍
       book_ser = BookSerializers(instance=book, data=request.data)  # 传入要修改的对象和数据
       if book_ser.is_valid():  # 校验数据
           book_ser.save()  # 保存数据,需要在自定义序列化器中重写update方法
           response_dic.data = book_ser.data
       else:
           response_dic.code = 99
           response_dic.msg = '校验不通过'
           response_dic.data = book_ser.errors  # 返回校验结果
       return Response(response_dic.dict)

   def delete(self, request, pk):  # 删除指定图书
       response_dic = utils.MyResponse()
       models.Books.objects.filter(pk=pk).delete()
       return Response(response_dic.dict)


# 查询全部书籍、增加新书籍
class BooksAPIView(APIView):
   def get(self, request):
       response_dic = utils.MyResponse()
       book = models.Books.objects.all()  # 获得全部book对象
       book_ser = BookSerializers(instance=book, many=True)  # 序列化多条数据需要加上many参数
       response_dic.data = book_ser.data
       return Response(response_dic.dict)

   def post(self, request):
       response_dic = utils.MyResponse()
       book_ser = BookSerializers(data=request.data)  # 新增时不需要传入修改对象,传入新增数据
       if book_ser.is_valid():  # 校验
           book_ser.save()
           response_dic.data = book_ser.data
       else:
           response_dic.code = 99
           response_dic.msg = '校验失败'
           response_dic.data = book_ser.errors
       return Response(response_dic.dict)

 

posted @ 2021-05-17 16:44  蚝油生菜  阅读(226)  评论(0)    收藏  举报