drf框架serializer之modelserializer(代码片段)

xiaogongjin xiaogongjin     2022-12-06     496

关键词:

一、基本语法

在没有使用ModelSerializer序列化器类之前,我们定义的序列化器类都需要添加对应模型类字段的很多字段,如果添加的字段特别多,那么势必会影响开发效率和代码的可读性,因此会选择一种更为简洁的序列化器类来帮我们优化框架代码,简化序列化器类中字段的创建

常规序列化器类示例:

from rest_framework import serializers
from rest_framework import validators
from .models import Projects


class ProjectSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=200, label="项目名称", help_text=项目名称,
                                 validators=[validators.UniqueValidator(queryset=Projects.objects.all(), message="项目名字段name必须唯一"),
                                             name_is_not_contain_x],)
    leader = serializers.CharField(max_length=50, label="项目负责人", help_text=项目负责人)
    programmer = serializers.CharField(max_length=50, label="开发人员", help_text="开发人员")
    tester = serializers.CharField(max_length=50, label="测试人员", help_text="测试人员")

使用ModelSerializer如下,已经简化了很多代码:

from rest_framework import serializers
from .models import Projects


class ProjectsModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Projects
        fields = __all__

规则总结如下:

  • 需要在Meta类中使用model类属性来指定需要按照哪一个模型类来创建
  • fields类属性指定模型类中哪些字段需要输入或输出
  • 默认id主键会添加read_only=True
  • create_time和update_time会默认添加read_only=True
  • ModelSerializer类中自带的有create和update方法,无需重写即可生效

二、使用方法

直接使用ModelSerializer实例化的对象替换掉原先的序列化器类对象即可

from django.http import JsonResponse
from django.views import View
from django.db import connection
import json
from .models import Projects
from .serializers import ProjectsModelSerializer


class ProjectsPage(View):
    ‘‘‘
    类视图
    ‘‘‘
    def post(self, request):

        input_data = json.loads(request.body)

        serializer_check_obj = ProjectsModelSerializer(data=input_data)

        if not serializer_check_obj.is_valid():
            return JsonResponse("code": 1, "res": "error", "msg": serializer_check_obj.errors)

        serializer_check_obj.save()

        return JsonResponse(serializer_check_obj.validated_data, status=201)

二、反序列化校验

1.默认全部字段输出或输入

在Meta子类中定义类属性fields=‘__all__‘

fields = __all__

2.指定需要输出或输入的字段

在Meta子类中定义类属性fields=(字段1,字段2,......)

fields = (name, leader, programmer)

3.排除不需要输出或输入的字段

在Meta子类中定义类属性exclude=(字段1,字段2,......)

exclude = (desc, )

4.只允许序列化输出

在Meta子类中定义类属性read_only_fields=(字段1,字段2,......)

read_only_fields = (update_time, )

5.自定义校验规则

1).在ModelSerializer类中创建字段类的对象

其优先级最高,如果以该类方式创建的方式很多,则应该选择普通的序列化器类来定义

from rest_framework import serializers
from rest_framework import validators
from .models import Projects


class ProjectsModelSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length=200, label="项目名称", help_text=项目名称,
                                 validators=[validators.UniqueValidator(queryset=Projects.objects.all(),
                                                                        message="项目名字段name必须唯一")], )

    class Meta:
        model = Projects
        fields = __all__

2).在Meta子类中定义extra_kwargs字段

键为字段名,值为一个字典,其中键为校验项,值为校验规则

from rest_framework import serializers
from rest_framework import validators
from .models import Projects


class ProjectsModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Projects
        fields = __all__
        extra_kwargs = 
            name: 
                max_length: 50,
                validators: [validators.UniqueValidator(queryset=Projects.objects.all(), message="项目名字段name必须唯一")]
            ,
            tester: 
                max_length: 200
            
        

三、添加不在模型类里面而需要反序列化的字段

  • 定义字段
  • 添加字段名称到ModelSerializer序列化器类Meta子类的fields属性中
  • 在Meta子类中重写create或者update方法
from rest_framework import serializers
from rest_framework import validators
from .models import Projects


def name_is_not_contain_x(value):
    if X in value.upper():
        raise serializers.ValidationError("项目名字段name不能包含x的大小写字符")


class ProjectsModelSerializer(serializers.ModelSerializer):

    email = serializers.EmailField(read_only=True)

    class Meta:
        model = Projects
        fields = (id, name, leader, programmer, tester, create_time, update_time, email)
        extra_kwargs = 
            name: 
                max_length: 50,
                validators: [validators.UniqueValidator(queryset=Projects.objects.all(), message="项目名字段name必须唯一"),
                               name_is_not_contain_x]
            ,
            tester: 
                max_length: 200
            
        

    def validate_name(self, value):
        if 项目 in value:
            raise serializers.ValidationError("项目名称name字段不能包含‘项目’字符")
        return value

    def validate(self, attrs):

        if A in attrs.get(name) and B in attrs.get(leader):
            raise serializers.ValidationError("项目名称字段name不包含A的同时项目负责人字段leader也不能包含B")
        return attrs

    def create(self, validated_data):
        validated_data.pop(email)

        return super().create(validated_data)

 

drf框架之serializers序列化组件(代码片段)

...lizers 3.DRF框架serializers分为:第一种Serializer 第二种ModelSerializer 第一种用法之Serializerfromdjango.dbimportmodels#Createyourmod 查看详情

drf框架之serializer序列化器的序列化操作(代码片段)

...DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer.今天,我们就先来学习一下Serializer序列化器。使用Serializer序列化器的开发步骤:1.定义Serializer序列化器首先,我们要在子应用中,创建见一个serializers.py文件,... 查看详情

drf序列化和反序列化(二:modelserializer)

...没有类似ModelFroms类似的模块,简化字段的编写,当然有ModelSerializer就是这中类型二:ModelSe 查看详情

09.drf-modelserializer(代码片段)

四、模型类序列化器ModelSerializer如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。ModelSerializer与常规的Serializer相同,但提供了:基于模型类自动... 查看详情

drf的serializer和modelserializer(代码片段)

...rField(default=0)goods_front_image=serializers.ImageField()#... 使用ModelSerializer可以免去这种繁琐的一个个添加字段的方式:classGoodsSerializer(serializers.ModelSerializer):classMeta:model=Goodsfields=(‘name‘,‘click_num‘,‘market_price‘,‘add_time‘)使用fiel... 查看详情

在 DRF 3 中的 ModelSerializer 上添加非模型字段

】在DRF3中的ModelSerializer上添加非模型字段【英文标题】:Addanon-modelfieldonaModelSerializerinDRF3【发布时间】:2015-08-1608:33:44【问题描述】:如何?即添加一个在我的实际模型中不存在的字段?classTestSerializer(serializers.ModelSerializer):url=... 查看详情

drf框架serializer之视图优化(代码片段)

一、create优化在serializer序列化中,我们通过创建序列化器对象的方式大大地简化了视图函数的代码,前端传入的数据通过反序列化操作进行了各种数据校验,代码如下:fromdjango.httpimportJsonResponsefromdjango.viewsimportViewfromdjango.dbimpor... 查看详情

drf的modelserializers中自定义了字段就必须重写create方法(代码片段)

DRF在写ModelSerializers时,如果你自定义了字段那么必须重写create方法,不然在ModelViewset中调用create方法时会报异常。classCommentModelSerializers(serializers.ModelSerializer):username=serializers.CharField(source= 查看详情

modelserializer组件(代码片段)

ModelSerializer组件一、DRF模型类序列化器如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。ModelSerializer与常规的Serializer相同,但提供了:基于模型... 查看详情

drf图片字段序列化完整路径(代码片段)

...des,area_detail,但结构如下:classChrDetailSerializer(serializers.ModelSerializer):"""年代地层详情序列化"""classMeta:model=Address_Lisfields=(‘region‘,)classLisDetailSerializer(serializers.ModelSerializer):"""岩石地层序列化"""parent_categry=ChrDetailSerializer()classMeta... 查看详情

drf之上传文件接口(代码片段)

...ns=[url('',include(router.urls))]serializers.pyclassBookUpdateImageModelSerializer(serializers.ModelSerializer):classMeta:model=models.Bookfields=['image']views.py#上传文件-修改头像fromrest_framework.viewsetsimportGenericViewSetfromrest_frameworkimportmixinsclassBookUpdateIma... 查看详情

drf高级五modelserializer(代码片段)

...。fromrest_frameworkimportserializersclassProductSerializer(serializers.ModelSerializer):classMeta:model=Productfields=__all__#exclude=(created,)#read_only_fields=(email,)指定只读字段#extra_kwargs=created:write_only:TrueMeta属性指定字段—fields__all__指模型下所有字段元组或... 查看详情

DRF,将自定义字段添加到 ModelSerializer

】DRF,将自定义字段添加到ModelSerializer【英文标题】:DRF,addcustomfieldtoModelSerializer【发布时间】:2019-01-0122:50:28【问题描述】:我的项目中有一些模型,我需要API的特殊响应,我正在使用DjangoRest框架。classGoal(models.Model):name=models.... 查看详情

Urlize DRF 链接

】UrlizeDRF链接【英文标题】:UrlizeDRFLink【发布时间】:2019-09-0111:15:42【问题描述】:我有一个DRF序列化器:classActivitySerializer(serializers.ModelSerializer):link=serializers.CharField(source=\'get_analytic_link\',allow_null=True)classMeta:model=Act 查看详情

drf数据验证+数据存储(代码片段)

1.验证数据的自定义类classBooksDRFt(serializers.ModelSerializer):classMeta:model=Bookfields=‘__all__‘#要验证的字段author=serializers.CharField(required=False)#要验证的字段name=serializers.CharField(min_length=2,error_messa 查看详情

drf-五大方法(重要)(代码片段)

序列化类#BookListSerializer是BookModelSerializer子序列化类classBookListSerializer(serializers.ListSerializer):#自定义的群增群改辅助类,没有必要重写create方法defcreate(self,validated_data):returnsuper().create(validated_data)#获取视图类中的validated_data_list进... 查看详情

django框架(十九)——序列化组件(serializer)(代码片段)

...本语法2、基于Serializer类实现序列化——高级语法3、基于ModelSerializer类实现序列化序列化组件#模型层fromdjango.dbimportmodelsclassBook(models.Mod 查看详情

drf部分(代码片段)

..."__all__"//field=["id","name"]    classGoodsSerializer(serializers.ModelSerializer):  category=GoodCategorySeriazlize()//(many=True),部分重定义,会显示详细内容  classMeta:    models=Goods    field="__all__"viewsfromrest_framework.viewsimportAPIViewfromres... 查看详情