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
  • 路由里面的参数跟视图里面的参数一定要一样,因为是关键字传参
posted @ 2020-04-22 17:44  帅丶高高  阅读(648)  评论(0)    收藏  举报