源码分析rest_framework中ModelSerializer和serializers中的save的基本用法和区别

提示:最好打开项目复制代码,跟着一步一步操作可以更好理解,如果想快速了解可直接跳到总结


前言

关于Django中rest_framework的ModelSerializer和serializers中的save的用法大家肯定有一些问题,这篇文章可以带大家从源码上了解save的最基本的用法


一、save方法是什么?

sava方法可以对数据库进行添加和修改操作时可以省略大部分代码,例如:

原始代码:

models.Date.objects.create("数据")

save方法:

对象.save()

二、步骤

1.代码

urls.py:

from django.urls import path,re_path
from api import views#我项目的名字叫api,根据自己去改
urlpatterns = [
    path('api/', views.DateView.as_view()),]

models.py:

class Date(models.Model):
    name = models.CharField(verbose_name="名字",max_length=10,)
    age= models.IntegerField(verbose_name="年纪")
    title= models.CharField(max_length=255, verbose_name="标题")

View.py:

from api import models
from django.views import View
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import serializers
class DateView(APIView):
    def post(self, request, *args, **kwargs):
        ser=DateSerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.validated_data)
        else:
            print(ser.errors)#验证失败的信息
        return Response("...")

2.serializers中的save

代码如下(示例):

View.py:

class DateSerializer(serializers.Serializer):
    name = serializers.CharField()
    age = serializers.IntegerField()
    title = serializers.CharField()
    

这里可以CTRL+鼠标左键点击class DateView中的save方法

我们可以知道save方法是在serializers里,这里代码我不仔细分析,下滑找到

调用save方法,会调用update或者create方法,功能分别是修改和创造,所以我们CTRL+鼠标左键点击这两个方法看

可知在serializers并没有写这两个方法,所以我们想在serializers里面使用save方法的话我们就可以改成这样

class DateSerializer(serializers.Serializer):
    name = serializers.CharField()
    age = serializers.IntegerField()
    title = serializers.CharField()
    def create(self, validated_data):
        return models.Date.objects.create(**validated_data)

我们重新写这个create方法(updata也一样,里面的instance参数可以理解为你要修改的数据的ID),就可以调用save的这个功能

3.ModelSerializer中的save方法

注意:在这里把DateSerializer这个类修改一下

 代码如下(示例):

View.py:

class DateSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Date
        fields = "__all__"

有一定的Django基础可以知道ModelSerializer和Serializer的区别,与Form和ModelForm的区别非常相似,ModelSerializer和Serializer的save方法基本一模一样,进入ModelSerializer发现ModelSerializer继承Serializer,所以整体方法两者非常相似,只是当执行update或者create方法时,以面向对象的知识点,会先到ModelSerializer里面找发现存在这两个方法

所以在ModelSerializer里面,直接就可以使用save,不需要重写create和update


总结

以上就是今天要讲的内容,本文仅仅简单介绍了ModelSerializer和Serializer的save的使用,在Serializer中要使用save方法的create和update的功能的话需要自己重写这两个方法,而ModelSerializer就提供了create和update的功能,可以直接用

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值