导入问题
首先我们先来想清楚几个问题
增删改查对应几个操作?
5个,增加:POST、删除:DELETE、查询所有:GET、查询一个:GET、更新:PUT
哪些需要参数,哪些不需要
不需要参数:增加、查询所有 需要参数: 查询一个、删除、更新
需要设计几个类视图
2个,为需要参数,不需要参数
要弄清序列化和反序列化有哪个操作
序列化:查 反序列化:增、改
配置序列化器
在setting.py,需要配置3个
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # drf框架
'corsheaders', # 跨域
'myapp', # 注册子应用
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware', # 跨域中间件
]
CORS_ORIGIN_ALLOW_ALL = True
1. 普通序列化器
1)在子应用中创建 serializers.py 文件
# 序列化器
from rest_framework import serializers
from myapp.models import People
class PeopleSerializer(serializers.Serializer):
# 与模型一一对应
name = serializers.CharField(max_length=20)
sex = serializers.CharField(max_length=20)
money = serializers.IntegerField()
ranking = serializers.IntegerField()
# 新增数据调用creat
def create(self, validated_data):
# ** 对validated_data 进行拆包操作
res = People.objects.create(
**validated_data
)
return res
# 修改数据需要实现update方法
# instance,要修改的ORM数据(实例)
# validated_data,用于修改ORM对象的数据
def update(self, instance, validated_data):
instance.name = validated_data.get('name')
instance.sex = validated_data.get('sex')
instance.money = validated_data.get('money')
instance.ranking = validated_data.get('ranking')
# 保存
instance.save()
# 返回修改后的ORM对象
return instance
2) 视图
导包
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import People
from myapp.serializers import PeopleSerializer,PeopleSerializer2
增加、查询所有
class PeopleView(APIView):
# 查询所有人物信息
def get(self,request):
people = People.objects.all()
# people是要序列化的数据 many=True 多个数据
# ser = PeopleSerializer(people,many=True)
ser = PeopleSerializer2(people, many=True)
# 注意:返回的是 .data
return Response(ser.data,status=200)
# 增加一个人物信息,反序列化 json数据 -> ORM格式数据
def post(self,request):
# 使用序列化器进行反序列化
# ser = PeopleSerializer(data=request.data)
ser = PeopleSerializer2(data=request.data)
# 判断反序列化是否成功
# raise_exception=True 如果出现异常,会抛出异常
if ser.is_valid(raise_exception=True):
# 保存
ser.save()
# 201 添加或修改成功
return Response({'msg':'success'},status=201)
return Response({'msg':'error'})
需要参数,修改删除,查询一个
class PeopleView2(APIView):
# 查询一个人物信息
def get(self,request,id):
try:
peo_data = People.objects.get(id=id)
except Exception as e:
print(e)
# 404 数据不存在
return Response({'msg':'error'},status=404)
# 对ORM查询到的数据进行序列化
# ser = PeopleSerializer(peo_data)
ser = PeopleSerializer2(peo_data)
# 返回数据是 .data
return Response(ser.data,status=200)
# 修改一个人物信息
def put(self,request,id):
try:
peo_data = People.objects.get(id=id)
except Exception as e:
print(e)
return Response({'msg': 'error'}, status=404)
# 对要更新的数据进行反序列化
# instance=peo_data,要修改的ORM数据(实例)
# data=request.data,用于修改ORM对象的数据
# ser = PeopleSerializer(instance=peo_data,data=request.data)
ser = PeopleSerializer2(instance=peo_data, data=request.data)
# 判断反序列化是否成功
if ser.is_valid(raise_exception=True):
ser.save()
# 201 添加/修改 成功
return Response({'msg':'success'},status=201)
return Response({'msg':'error'},status=500)
# 删除一个人物信息
def delete(self,request,id):
try:
People.objects.filter(id=id).delete()
except Exception as e:
print(e)
return Response({'msg':'error'},status=404)
# 204 是删除成功
return Response({'msg':'success'},status=204)
3) 路由
from django.urls import path
from myapp import views
urlpatterns = [
path('myview/',views.MyView.as_view()),
path('people/',views.PeopleView.as_view()),
path('people/
]
2.模型序列化器
优化普通序列化器
# 模型序列化器
class PeopleSerializer2(serializers.ModelSerializer):
# 定义元类
class Meta:
# 指定模型类
model = People
# 指定映射字段
fields = '__all__'
在视图中和普通序列化器运用的方法是一样的
特点
自动生成一系列字段生成字段包含unique、max_length等限制包含默认create和update实现
缺点
不会自动映射模型类字段的default属性
3 模型序列化器与普通序列化器的对比
序列化时,将模型类对象传入instance参数
序列化结果使用序列化器对象的data属性获取得到 反序列化创建时,将要被反序列化的数据传入data参数
反序列化一定要记得先使用is_valid校验 反序列化更新时,将要更新的数据对象传入instance参数,更新后的数据传入data参数模型序列化器比普通序列化器更加方便,自动生成序列化映射字段,create、update方法等
相关阅读
发表评论