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

Posted 蚝油生菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于python drf 序列化器之数据的增删改查(详细)的主要内容,如果未能解决你的问题,请参考以下文章

RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查

使用drf的序列化类实现增删改查接口

多对多表的增删改查与drf的分页

python序列(列表,元组,字典)的增删改查

python3中列表元组字典的增删改查说明详解

drf序列化器之请求响应以及视图