DRF的序列化

DRF视图

APIview

django中写CBV的时候是继承View,而rest_framework继承的是APIView,那么他们两个有什么不同

urlpatterns = [
    url(r‘^book$‘, BookView.as_view()),
    url(r‘^book/(?P<id>\d+)$‘, BookEditView.as_view()),
]

 不管是View还是APIView最开始调用的都是as_view()方法,看源码有什么区别

我们能看到,APIView继承了View, 并且执行了View中的as_view()方法,最后把view返回了,用csrf_exempt()方法包裹后去掉了csrf的认证。

然后看view中as_view()方法做了什么

在View中的as_view方法返回了view函数,而view函数执行了self.dispatch()方法 ,但是这里的dispatch方法按照顺序应该从自己开始寻找,而在APIview中,也写了dispatch方法,所以应该执行的是APIview中的dispatch方法

这里我我需要注意initialize_request中到底做了什么

这里返回的是一个实例化对象

这会django原先的request变成了self._request

视图

自己写的版本

# 自己重写的视图
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.viewsets import ViewSetMixin
# 获取要的数据
class GenericAPIView(APIView):
    queryset = None
    serializer_class = None

    # 获取queryset
    def get_queryset(self):
        return self.queryset.all()

    # 获取序列化器
    def get_serializer(self, *args, **kwargs):
        return self.serializer_class(*args, **kwargs)

# get方法(查询多条)
class ListModelMixin(object):
    def list(self, request):
        queryset = self.get_queryset()
        ser_obj = self.get_serializer(queryset, many=True)
        return Response(ser_obj.data)

# 查询单条
class RetrieveModelMixin(object):
    def retrieve(self, request, id):
        stu_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(stu_obj)
        return Response(ser_obj.data)

# post方法
class CreateModelMixin(object):
    def create(self, request):
        ser_obj = self.get_serializer(data=request.data)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.data)
        else:
            return Response(ser_obj.errors)

# put/patch方法:修改单个的
class UpdateModelMixin(object):
    def update(self, request, id):
        stu_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(instance=stu_obj, data=request.data, partial=True)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.validated_data)
        return Response(ser_obj.errors)

# delete方法
class DestroyModelsMixin(object):
    def destroy(self, request, id):
        stu_obj = self.get_queryset().filter(id=id).first()
        if stu_obj:
            stu_obj.delete()
            return Response("")
        return Response("删除的对象不存在")

# # 所有方法只要继承这个就可以
class ModelViewSet(
    ViewSetMixin,
    GenericAPIView,
    ListModelMixin,
    RetrieveModelMixin,
    CreateModelMixin,
    UpdateModelMixin,
    DestroyModelsMixin,

):
    pass

class Student(ModelViewSet):
    queryset = models.Student.objects
    serializer_class = StudentSerializer

自己重写的

他还有一个自带的模块和这个一样

from rest_framework.viewsets import ModelViewSet
class Student(ModelViewSet):
    queryset = models.Student.objects
    serializer_class = StudentSerializer

自带的模块

urls.py代码

DRF的路由

这个路由其实也封装好了,但是封装越好的东西,应用场景限制的也越多

from .views import BookView
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r"book", BookView)

urlpatterns = [
    # url(r‘^book$‘, BookView.as_view()),
    # url(r‘^book/(?P<id>\d+)$‘, BookEditView.as_view()),
    # url(r‘^book$‘, BookView.as_view({"get": "list", "post": "create"})),
    # url(r‘^book/(?P<pk>\d+)$‘, BookView.as_view({"get": "retrieve", "patch": "update", "delete": "destroy"})),

]
urlpatterns += router.urls

路由

原文地址:https://www.cnblogs.com/chunqiuyu/p/9901201.html

时间: 2024-07-30 16:19:16

DRF的序列化的相关文章

drf框架 - 序列化组件 | Serializer

序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 反序列化: 将字符串反序列化成对象用于使用 drf的序列化与反序列化 序列化: 将Model类对象序列化成字符串用户传输 反序列化: 将字符串反序列化成Model对象用于使用 Serializer 序列化准备: 模型层: models.py class User(models.Model): SE

drf框架 - 序列化组件

drf框架 - 序列化组件 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 反序列化: 将字符串反序列化成对象用于使用 drf的序列化与反序列化 序列化: 将Model类对象序列化成字符串用户传输 反序列化: 将字符串反序列化成Model对象用于使用 Serializer 序列化准备: 模型层: models.py class User(models.Model): SEX_CHOICES = [ [0, '男'], [1, '女'], ] name = models.CharFiel

drf框架序列化

目录 drf框架序列化 |反序列化: 序列化与反序列化: drf序列化与反序列化: 序列化: models.py Serializers.py Serializer 反序列化: views.py: ModelSerializers 指定表模型: 自定义反序列化方法: drf框架序列化 |反序列化: 序列化与反序列化: 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 序列化是为了保持对象在内存中的状态,并且可以把保存的对象状态再读出来 a.数据持久化:比如一个电商平台,有数万

DRF如何序列化外键的字段

我觉得在有些应用场景下,这个操作是有用的,因为可以减少一个AJAX的请求,以增加性能. 当然,是二次请求,还是一次传输.这即要考虑用户体验,还要兼顾服务器性能. 一切是有条件的平衡吧.就算是一次传输,字段少的可以全部传,而字段多的就要自定义啦. 在以下样例里,发布单是主表,但相关的项目,组件,用户,如果默认情况下,只显示ID,很不友好. 我们可以将相关的外键名称也一并序列化啦. 重点的DRF: class UserSerializer(serializers.ModelSerializer):

DRF之序列化

目录 准备事项 序列化组件初见 序列化字段 ModelSerializer 重载create方法 单条数据处理 现阶段代码 准备事项 # models.py from django.db import models class Publisher(models.Model): title = models.CharField(max_length=32) address = models.CharField(max_length=128) def __str__(self): return se

drf的序列化器

三流 import sys #标准输出流 sys.stdout.write('123\n') sys.stdout.write('456\n') #标准输入流 res=sys.stdin.readline() print(res) #标准错误流:将括号内数据作为错误输出 sys.srderr.write('abc\n') sys.stderr.write('xyz\n) 注意:每个流之间为异步提交,流内为同步提交. JSON文件格式 JSON 值可以是: 数字(整数或浮点数) 字符串(在双引号中

drf 核心 序列化组件Serializer

知识点: Serializer(偏底层).ModelSerialize(重点).ListModelSerializer(辅助群改) 一.Serializer 1.序列化准备: 模型层:models.py class User(models.Model): SEX_CHOICES = [ [0, '男'], [1, '女'], ] name = models.CharField(max_length=64) pwd = models.CharField(max_length=32) phone =

DRF解析组件以及序列化组件

一.知识点回顾: 1.三元运算: 三元运算能够简化我们的代码,请看如下代码: # 定义两个变量 a = 1 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达式后面的值赋给c c = a if a else b print(c) # 1 # 因为a的真假值判断为True,所以c为1 # 定义两个变量 a = 0 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达式后面的值赋给c c = a if a else

drf序列化器serializers.SerializerMethodField()的用法

为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request,如果有,就给图片加上域名, 比如说我们视图用的是apiview(): 我们需要序列化数据的时候,加  context={"request":request} TestSerilaizer(instance=instance, context={"request":request})