首页 > 其他 > 详细

Django restframework 序列化之 ModelSerializer 小记

时间:2019-08-20 23:23:24      阅读:537      评论:0      收藏:0      [点我收藏+]

首先介绍一下相关概念

序列化器(Serializer) 

  1. 自定义型:  继承rest_framework.serializers.Serializer

  2. 模型类型:  继承rest_framework.serializers.ModelSerializer

 

创建Serializer对象

构造方法:Serializer(instance=None, data=empty, **kwarg)

参数1,序列化必须传入的模型类对象

参数2,反序列化时把数据传入data

额外参数:例如context={‘XX‘:‘XX‘},可通过context属性获取, context上下文解析详解上面官方文档

序列化注意点:

1. 序列化时如果被序列化是多条查询集,通过添加many=True,列表形式

如果关联对象有多个,也可以在序列化器字段添加many=True

2. 如果模型类存在外键字段,处理方式如下:

①PrimaryKeyRelatedField,需设置read_only=True或queryser参数

被序列化后是关联字段数据

②StringRelatedField,被序列化是关联对象__str__返回值

③HyperlinkedRelatedField,需设置read_only,view_name

被序列化为关联对象数据的API链接

④SlugRelateField,需设置read_only,slug_field

被序列化后是关联对象的指定字段数据

⑤使用关联对象的序列化器类的实例

⑥重写to_representation 可修改被序列化后的返回值

 

反序列化

验证:在反序列化时,对数据验证,验证成功后才可获取数据或保存为模型类对象

①调用is_valid方法验证,成功True,失败False

②验证失败时,通过序列化器对象的errors属性获取错误信息,返回字典包含字段和字段错误,如果非字段错误,可修改配置中NON_FIELD_ERRORS_KEY来控制键名

③验证成功时,通过序列化器对象的validated_date属性获取数据

注意点:带参数raise_exception=True在反序列化时is_valid()方法在验证失败时抛出serializers.ValidationError,REST framework接收到此异常,会向前端返回HTTP 400 Bad Request响应。

 

自定义验证行为:

1. validate_字段名:在序列化器中添加方法,方法名validate_字段名,参数为value,对value做校验,raise

serializers.ValidationError(‘XXXX‘),返回值value

2. validate:在序列化器中添加validate方法,可同时对多个字段进行验证

参数为attrs,从attrs中获取值,然后进行逻辑处理,抛出异常,返回值attrs

3.validator:在序列化器上方编写函数,参数value,对value校验,抛出异常

在序列化器字段中加入validator选项参数,为列表形式,值为函数名。

4.REST framework提供的validators:

UniqueValidator单字段唯一:字段中设置,参数为queryset

UniqueTogetherValidation联合唯一:class Meta中设置,参数queryset和fields

 

保存:如果验证成功,向基于validated_data完成数据对象的创建,可以通过create和update来实现

1.新建:在序列化器中重写create方法,参数为validate_data,

返回值为模型类.objects.create(**validated_data)

2.更新:在序列化器中重写update方法,参数instance即要更新的实例和validate_data

对validate_data字典获取其值,对无传递值给予默认值 instance.字段,并赋给instance.字段,然后调用instance.save()提交,返回值instance

 

注意点:

①实现了create和update方法后,在反序列化时既可以序列化对象.save()返回数据对象实例并保存或更新到数据库

②调用save时,如果有传instance实例,则调用update方法更新数据,否则调用create方法新建数据。

③调用save可传参,参数可从validated_data中获取

④如果没有传递所有required字段,会抛出验证异常,可通过使用partial=True实现部分字段更新

 

模型类序列化器ModelSerializer

可基于模型类自动生成一系列字段,会自动生成valiators和实现了默认的create和update方法

ModelSerializer

ModelSerializer 类似于 ModelForm 提供了一些便捷的方法,使你可以自动对 Django Model 中包含的部分或所有字段序列化。
用法上 ModelSerializer 和 Serializer 基本相同,除下面几点外:

    • 在 Model 字段的基础上自动生成序列化字段
    • 自动生成对 unique_together 的 validators
    • 自动包含基础的 .create(), update() 的实现

 

关于序列化,之前在处理分页时已经使用过了。

 

这次通过一个用户信息列表及新增用户介绍一下ModelSerializer 在项目中的具体应用。

 

其他项目配置相关不做介绍,从创建models开始

# models.py


from django.db import models

# Create your models here.



class UserInfo(models.Model):
    ‘‘‘用户信息表‘‘‘

    #  unique=True 限定唯一
    username = models.CharField(verbose_name=用户名,max_length=32,unique=True)
    # 表单提交可为空,数据库存储可为 NULL blank=True, null=True
    nickname = models.CharField(verbose_name=名称, max_length=32,blank=True, null=True)
    telephone = models.CharField(max_length=11, blank=True, null=True, unique=True, verbose_name=手机号码)
    email = models.EmailField(max_length=64,blank=True, null=True, unique=True,verbose_name=email)
    password = models.CharField(verbose_name=密码, max_length=128)
    # 用户项目分组
    usergroup = models.CharField(verbose_name=用户分组, max_length=128, null=True,blank=True)
    # 用户类型
    usertype = models.CharField(verbose_name=用户类型, max_length=128, null=True,blank=True)
    avatar = models.ImageField(verbose_name=头像, upload_to=avatar, default="/avatar/default.png", null=True,blank=True)
    status = models.IntegerField(verbose_name=用户状态,default=1)
    userPermissions = models.CharField(verbose_name=用户权限,max_length=1024,null=True,blank=True)
    createTime = models.DateTimeField(verbose_name=创建时间, auto_now_add=True)
    updateTime = models.DateTimeField(verbose_name=修改时间,auto_now=True)
    description = models.TextField(verbose_name=备注,null=True,blank=True)


    class Meta:
        db_table = UserInfo
        verbose_name = 用户信息
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

 

在项目下创建序列化文件serializers.py 代码如下

注意:注意注释说明,fields、exclude 限定那些字段,那些字段将会被实例化或是不被实例化,如exclude = (‘password‘,),添加用户时,password 会被存储为空。

# FileName : serializers.py
# Author   : Adil
# DateTime : 2019/8/20 4:58 PM
# SoftWare : PyCharm

# ~/AutomatedTest/TestPlatform/serializers.py

from TestPlatform.models import UserInfo

from rest_framework import serializers


class UserInfoSerializer(serializers.ModelSerializer):


    class Meta:
        model = UserInfo
        fields = __all__   # fields 属性设置为特殊值 ‘__all__‘,以指示应该使用模型中的所有字段。 实例化时将可以看到所有字段
        # exclude = (‘password‘,)   # 注意:结尾的 ‘,‘ 逗号,去掉会序列化失败。exclude 属性设置为从序列化程序中排除的字段列表。 实例化时将看不到  password 字段,及password 不被序列化,
        # fields = (‘username‘,‘password‘,‘email‘)  # 序列化指定字段。
        # exclude = [‘password‘]  # 使用list  形式也是可以的,此时可以不要逗号。同理fields 也支持 list 形式,因为官网 就是 list形式。


    #  本身ModelSerializer  它包含 .create() 和 .update() 的简单默认实现。 所以 这里 写不写 下面两个方法都行,但是在嵌套序列化 的情况下要 重写下面两个方法。
    # def create(self, validated_data):
    #     print("~~~~~~~~~~~~~~")
    #     print(validated_data)
    #     return UserInfo.objects.create(**validated_data)
    #
    #
    # def update(self, instance, validated_data):
    #
    #     instance.name = validated_data.get(‘name‘,instance.name)
    #
    #
    #     instance.save()
    #     return instance

 

创建用户视图文件

# FileName : userviews.py
# Author   : Adil
# DateTime : 2019/8/20 4:47 PM
# SoftWare : PyCharm

# 在应用下添加用户中心文件夹usercenter,并创建用户视图文件userviews.py
# TestPlatform/usercenter/userviews.py


from rest_framework.views import APIView
from django.http import JsonResponse
from rest_framework.request import Request
from TestPlatform.models import UserInfo
from TestPlatform.serializers import UserInfoSerializer


class AddUserView(APIView):
    ‘‘‘添加用户‘‘‘

    def post(self,request):

        ret = {code:1,msg:None,data:None}

        try:

            username = request.data.get(username,None)

            print(username)

            user_list = UserInfo.objects.all()
            # 序列化实例
            ul = UserInfoSerializer(user_list,many=True)   # 虽然是单个实例对象,many = True 还是要加的,不加报错。

            print(ul)

            print(ul.data)

            # 根据接口提供参数 进行反序列化
            ul1 = UserInfoSerializer(data=request.data)
            print("******")
            print(ul1)
            print(ul1.is_valid())
            # 进行数据校验,通过返回True,失败返回False
            if ul1.is_valid():

                print(ul1.validated_data)
                # 成功说明可以保存,调用 .save()保存实例到数据库。
                ul1.save()
                ret[msg] = 成功!
                ret[data] = ul1.data
                # return JsonResponse(ul1.data)

            else:
                ret[msg] = 失败!
                # 失败返回失败信息。
                ret[data] = ul1.errors



        except Exception as e:
            ret[code] = 0
            ret[msg] = 失败!


        return JsonResponse(ret)        

 

 

配置应用下urls.py文件

# FileName : urls.py
# Author   : Adil
# DateTime : 2019/8/19 4:48 PM
# SoftWare : PyCharm

# TestPlatform/urls.py

from django.urls import path

from TestPlatform.usercenter.userviews import AddUserView

urlpatterns = [

    # path(‘add/‘,add)
    path(adduser/,AddUserView.as_view())


]

 

配置项目下主urls.py文件

# AutomatedTest/urls.py

from django.contrib import admin
from django.urls import path,include

# from django.conf.urls import url,include


urlpatterns = [
    path(admin/, admin.site.urls),
    path(auto/,include(TestPlatform.urls))

 

注意:这样配置的接口路径为 auto/adduser/

 

启动项目,

添加用户,如图,添加了几个必填字段

技术分享图片

 

 添加重复用户,查看提示信息

技术分享图片

 

查看数据库表

技术分享图片

 

 

 

先简单介绍到这里,后续介绍一下,接口请求等相关知识。 

 

Django restframework 序列化之 ModelSerializer 小记

原文:https://www.cnblogs.com/BlueSkyyj/p/11385874.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!