# 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