3-2 序列化-DRF模型序列化-ModelSerializer
目录:
- 模型序列化(ModelSerializer)简介
- 模型序列化应用post和get(获取所有表数据)
- 模型序列化应用put(全部参数更新)、get(根据id获取表单条数据)、delete方法、patch(部分参数更新)
- 小结
一、模型序列化(ModelSerializer)简介
之前我们学习了Serializer,要把我们的模型(model)中的每一个字段都要重新定义一遍,并且还要重写我们的 create 方法和 update 方法。这个就有点麻烦了,会大大增加我们的代码量。那咋办吧?有没有更好的办法呐,这个时候有出现我们的 ModelSerializer,我的乖乖,这个就牛逼了,而且用的比较多,这个简化我们的代码。
ModelSerializers默认帮我们实现了创建和更新方法,简化了我们的操作,当然如果你想自己写,可以重写它。其余使用方法跟普通的序列化一样。
ModelSerializer中model模型有什么字段,我们就展示什么字段,都帮你定义好了。废话不多说了,来看看我们的 ModelSerializer是怎么定义的:
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('id', 'title', 'vum', 'content') #fields、exclude、fields 三者只能取一
#exclude = () 表示不返回字段
#fields = '__all__': 表示所有字段(表示模型有什么字段,我们就显示什么字段)
#read_only_fields = () #设置只读字段 不接受用户修改
请求原理图:
二、模型序列化应用新增(post)和获取(get)
2.1、目录结构
-drf_test #项目名
-app02
...
-models.py #存放模型类
-serializers.py #新建,序列化我们的模型类
-views.py #存放视图
-urls.py # 子路由
-drf_test
-__init__.py
-settings.py
-urls.py #主路由
-wsgi.py
-manage.py
2.2、模型序列化
说明:编写 serializers.py,定义 模型序列化类
from rest_framework import serializers
from .models import Article
#模型序列化
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article #告诉序列化类,你用的是 model类是什么
fields = ("id", 'vum', 'content', 'title') #定义需要序列化的字段
#fields = "__all__"
2.3、 编写视图(post和get)
说明:编写 views.py ,定义我们的视图,实现我们的 新增(post) 和 查询(get)功能,注意:这边我们没有用 终端去调试,直接在 views.py中去写的
from .serializers import ArticleSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from django.http import HttpResponse
from .models import Article
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
class JSONResponse(HttpResponse):
"""重新封装一下HttpResponse避免重复代码"""
def __init__(self, data, **kwargs):
content = JSONRenderer().render(data)
kwargs['content_type'] = 'application/json'
super(JSONResponse, self).__init__(content, **kwargs)
@csrf_exempt #解决 403 csrf_token验证问题
def article_list(request):
"""
文章标题
:return:
"""
if request.method == "GET":
arts = Article.objects.all()
ser = ArticleSerializer(instance=arts, many=True) #因为是多个对象实例,所以必须加上 many=true
# JSONRenderer 已经帮你封装好了,所以下面两行代码注释
#json_data = JSONRenderer().render(ser.data)
#return HttpResponse(json_data, content="application/json", status=200)
return JSONResponse(ser.data, status=200)
elif request.method == "POST":
data = JSONParser().parse(request) # 把前端页面传递过来的数据转成 python识别的数据类型
ser = ArticleSerializer(data=data) # 反序列化新增数据需要传入data
if ser.is_valid():
ser.save()
return JSONResponse(ser.data, status=201) #状态码(status)到 RESTFul介绍中去找,里面有详细的说明
return JSONResponse(ser.errors,status=401)
2.4、编写应用级(app02)路由
说明:我们可以在我们的每一个app下面创建自己的路由
from django.urls import path
from . import views
urlpatterns = [
path("article/", views.article_list, name="article-list") #编写app01->urls.py => http://127.0.0.1:8000/api/article/
]
2.5、编写根级路由
from django.contrib import admin
from django.urls import path, include
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('app02.urls')) #指向 app01 下的 urls.py => http://127.0.0.1:8000/api/article/
]
2.6、postman测试运行结果
1、测试请求 GET方法:

2、请求POST方法

三、模型序列化之删除和更新
之前我们学习了 POST和GET方法,接下来,我们还要学习一下 put(全量更新)、patch(部分更新)、get(id=id)获取单条数据、delete删除数据。
3.1、继续编辑视图view.py
说明:我们编写删除(delete)、更新(patch、put)、获取(get) => 接着上面的 views.py代码写的。
@csrf_exempt
def article_detail(request,id): #插入参数 id
"""
文章详情
:param request:
:param id: 文章id
:return:
"""
try:
art = Article.objects.get(id=id) # 需要做异常处理,当不存在的时候
except Article.DoesNotExist as e:
return HttpResponse(status=404)
if request.method == "GET": #获取单条数据
ser = ArticleSerializer(instance=art) #instance 可以写也可以不写
return JSONResponse(ser.data,status=200)
elif request.method == "PUT": #全部更新
data = JSONParser().parse(request)
ser = ArticleSerializer(instance=art,data=data)
if ser.is_valid():
ser.save()
return JSONResponse(ser.data,status=201)
return JSONResponse(ser.errors,status=400)
elif request.method == "PATCH": #部分更新
data = JSONParser().parse(request)
ser = ArticleSerializer(instance=art,data=data,partial=True) #partial=True 意思是我要部分更新,默认是False
if ser.is_valid():
ser.save()
return JSONResponse(ser.data,status=201)
return JSONResponse(ser.errors,status=400)
elif request.method == "DELETE": #删除
art.delete()
return HttpResponse(status=204)
3.2、 编辑路由
说明:编辑app01 -> urls.py ,设置路由,传入对应的参数 id
from django.urls import path
from app02 import views
urlpatterns = [
path("article/", views.article_list, name="article-list"),
path("article/<int:id>/", views.article_detail, name="article-detail") #传入 article id
]
3.4、postman测试运行结果
1、get(id=1)的请求:

2、PUT(id=1)全量更新测试结果:

3、patch(id=1)部分参数更新:

4、delete(id=1)删除数据:

四、小结
- 当请求方法为PATCH 序列化需要加 partial=True 让支持增量更新
- 返回JSON 数据的 content_type 一定是 application/json
- 路由里面的参数跟视图里面的参数一定要一样,因为是关键字传参

浙公网安备 33010602011771号