导入问题

首先我们先来想清楚几个问题

增删改查对应几个操作?

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//',views.PeopleView2.as_view()),

]

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方法等

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: