首页 > 编程语言 > 详细

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

时间:2021-05-17 22:43:13      阅读:28      评论:0      收藏:0      [点我收藏+]
#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 序列化器之数据的增删改查(详细)

原文:https://www.cnblogs.com/hysc/p/14777552.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!