当前位置: 首页 > news >正文

dedecms仿站教程大连网站建设培训

dedecms仿站教程,大连网站建设培训,盘石 网站建设,建设图书馆网站的意义Django RestFramework(简称DRF) 提供了序列化器Serialzier的定义#xff0c;可以帮助我们简化序列化与反序列化的过程#xff0c;不仅如此#xff0c;还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文…Django RestFramework(简称DRF) 提供了序列化器Serialzier的定义可以帮助我们简化序列化与反序列化的过程不仅如此还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持。 github地址 https://github.com/encode/django-rest-framework 中文文档https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-framework 1 项目基础搭建 1.1 安装DRF pip install Django2.0.13 pip install djangorestframework3.10.3 pip install PyMySQL1.0.21.2 创建django项目 django-admin startproject drfdemo # 创建应用 python manage.py startapp students在settings.py的INSTALLED_APPS中添加rest_framework和其他子应用: INSTALLED_APPS [...rest_framework,students, ]1.3 models和数据库设置 students/models.py 文件内容 class Student(models.Model):# 模型字段name models.CharField(max_length100,verbose_name姓名)sex models.BooleanField(default1,verbose_name性别)age models.IntegerField(verbose_name年龄)class_null models.CharField(max_length5,verbose_name班级编号)description models.TextField(max_length1000,verbose_name个性签名)class Meta:db_tabletb_studentverbose_name 学生verbose_name_plural verbose_name创建本地数据库并在django项目中进行mysql链接 settings.py文件修改DATABASES内容 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: rest_django_stu,HOST: 127.0.0.1,PORT: 3306,USER: root,PASSWORD: root,} }# 打印每次执行sql时输出 sql语句 LOGGING {version: 1,disable_existing_loggers: False,handlers: {console: {level: DEBUG,class: logging.StreamHandler,},},loggers: {django.db.backends: {handlers: [console],propagate: True,level: DEBUG,},} }主引用中__init__.py设置使用pymysql作为数据库驱动 import pymysqlpymysql.install_as_MySQLdb()在本地创建测试数据库 # 连接本地mysql后执行 create database rest_django_stu charsetutf8;# 终端下执行数据迁移 python manage.py makemigrations python manage.py migrate2 序列化器-Serializer的基础使用 序列化序列化器会把模型对象转换成字典经过response以后变成json字符串反序列化把客户端发送过来的数据经过request以后变成字典序列化器可以把字典转成模型反序列化可以完成数据校验功能 2.1 定义序列化器 子应用下新建serializer.py文件内容 from rest_framework import serializers# 声明序列化器所有的序列化器都要直接或者间接继承于 Serializer class StudentSerializer(serializers.Serializer):学生信息序列化器# 1. 需要进行数据转换的字段id serializers.IntegerField()name serializers.CharField()age serializers.IntegerField()sex serializers.BooleanField()description serializers.CharField()注意serializer不是只能为数据库模型类定义也可以为非数据库模型类的数据定义。 serializer是独立于数据库之外的存在。 常用字段类型 字段字段构造方式BooleanFieldBooleanField()NullBooleanFieldNullBooleanField()CharFieldCharField(max_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrue)EmailFieldEmailField(max_lengthNone, min_lengthNone, allow_blankFalse)RegexFieldRegexField(regex, max_lengthNone, min_lengthNone, allow_blankFalse)SlugFieldSlugField(maxlength50, min_lengthNone, allow_blankFalse) 正则字段验证正则模式 [a-zA-Z0-9-]URLFieldURLField(max_length200, min_lengthNone, allow_blankFalse)UUIDFieldUUIDField(format‘hex_verbose’) format: 1) hex_verbose 如5ce0e9a5-5ffa-654b-cee0-1238041fb31a 2 hex 如 5ce0e9a55ffa654bcee01238041fb31a 3int - 如: 123456789012312313134124512351145145114 4urn 如: urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31aIPAddressFieldIPAddressField(protocol‘both’, unpack_ipv4False, **options)IntegerFieldIntegerField(max_valueNone, min_valueNone)FloatFieldFloatField(max_valueNone, min_valueNone)DecimalFieldDecimalField(max_digits, decimal_places, coerce_to_stringNone, max_valueNone, min_valueNone) max_digits: 最多位数 decimal_palces: 小数点位置DateTimeFieldDateTimeField(formatapi_settings.DATETIME_FORMAT, input_formatsNone)DateFieldDateField(formatapi_settings.DATE_FORMAT, input_formatsNone)TimeFieldTimeField(formatapi_settings.TIME_FORMAT, input_formatsNone)DurationFieldDurationField()ChoiceFieldChoiceField(choices) choices与Django的用法相同MultipleChoiceFieldMultipleChoiceField(choices)FileFieldFileField(max_lengthNone, allow_empty_fileFalse, use_urlUPLOADED_FILES_USE_URL)ImageFieldImageField(max_lengthNone, allow_empty_fileFalse, use_urlUPLOADED_FILES_USE_URL)ListFieldListField(child, min_lengthNone, max_lengthNone)DictFieldDictField(child) 选项参数 参数名称作用max_length最大长度min_length最小长度allow_blank是否允许为空trim_whitespace是否截断空白字符max_value最大值min_value最小值 通用的选项参数 参数名称说明read_only表明该字段仅用于序列化输出默认Falsewrite_only表明该字段仅用于反序列化输入默认Falserequired表明该字段在反序列化时必须输入默认Truedefault反序列化时使用的默认值allow_null表明该字段是否允许传入None默认Falsevalidators该字段使用的验证器error_messages包含错误编号与错误信息的字典label用于HTML展示API页面时显示的字段名称help_text用于HTML展示API页面时显示的字段帮助提示信息 2.2 配置url路由分发 # 全局urls.py文件 from django.contrib import admin from django.urls import path,re_path,include # re_path --- django1.11 urlurlpatterns [path(admin/, admin.site.urls),path(stu/, include(student.urls)), ]# 子应用student/urls.py文件 from django.contrib import admin from django.urls import path,re_path,include # re_path --- django1.11 url from ser import views urlpatterns [path(students/, views.StudentsView.as_view()), # stu/students/ ]2.3 序列器的序列化功能 在子应用views.py文件中 from django.http import JsonResponse from django.views import View from .serializers import StudentSerializer from students.models import Student class StudentView(View):def get(self,request): # [{},]# queryset类型数据# students models.Student.objects.all() ## serializer_obj StudentSerializer(instancestudents,manyTrue) # 列表套字典# 序列化单条数据(模型类对象)students models.Student.objects.get(id1)serializer_obj StudentSerializer(instancestudents) #--字典print(serializer_obj.data,type(serializer_obj.data))return JsonResponse(serializer_obj.data,safeFalse,json_dumps_params{ensure_ascii:False})定义好Serializer类后就可以创建Serializer对象了。 Serializer的构造方法为 Serializer(instanceNone, dataempty, **kwarg)说明 1用于序列化时将模型类对象传入instance参数 2用于反序列化时将要被反序列化的数据传入data参数 3除了instance和data参数外在构造Serializer对象时还可通过context参数额外添加数据如 serializer AccountSerializer(account, context{request: request})通过context参数附加的数据可以通过Serializer对象的context属性获取。 使用序列化器的时候一定要注意序列化器声明了以后不会自动执行需要我们在视图中进行调用才可以。序列化器无法直接接收数据需要我们在视图中创建序列化器对象时把使用的数据传递过来。序列化器的字段声明类似于我们前面使用过的表单系统。开发restful api时序列化器会帮我们把模型数据转换成字典.drf提供的视图会帮我们把字典转换成json,或者把客户端发送过来的数据转换字典. 2.4 反序列化功能 from rest_framework.views import APIView class StudentsView(APIView): # class StudentsView(View): # 基础视图类无法接收json数据。def post(self,request):# print(, request.POST) #由于用户提交的数据可能是json数据django解析不了所有我们借助drf来解析就需要继承drf的APIView类print(, request.data) #{name: chaochaochao, age: 18}字典类型数据serializer_obj StudentSerializer(datarequest.data)if serializer_obj.is_valid(): #所有字段校验都没问题返回True但凡是有一个字段校验失败返回Falseprint(校验成功之后的数据,serializer_obj.validated_data)# 然后保存数据return JsonResponse(serializer_obj.validated_data)else:print(serializer_obj.errors)return JsonResponse({error:校验失败},status400)2.4.1 数据验证 使用序列化器进行反序列化时需要对数据进行验证后才能获取验证成功的数据或保存成模型类对象。 在获取反序列化的数据前必须调用**is_valid()**方法进行验证验证成功返回True否则返回False。 验证失败可以通过序列化器对象的errors属性获取错误信息返回字典包含了字段和字段的错误。如果是非字段错误可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。 验证成功可以通过序列化器对象的validated_data属性获取数据。 在定义序列化器时指明每个字段的序列化类型和选项参数本身就是一种验证行为。 from rest_framework import serializers class StudentSerializer(serializers.Serializer):# 需要转换的字段声明# 小括号里面声明主要提供给反序列化使用的name serializers.CharField(requiredTrue, max_length20)age serializers.IntegerField(max_value150, min_value0,requiredTrue)sex serializers.BooleanField(defaultTrue)description serializers.CharField(requiredFalse,allow_nullTrue, allow_blankTrue) #requiredFalse,字段都可以不传递给后端allow_nullTrue,允许提交过来的数据为空值(null--None)allow_blankTrue 允许提交过来的数据为空字符串如果觉得这些还不够需要再补充定义验证行为可以使用以下三种方法 2.4.2 局部钩子 validate_字段名 方式 对field_name字段进行验证如 class StudentSerializer(serializers.Serializer):学生数据序列化器...# 序列化器中可以自定义单个字段的验证方法 def validate_字段名(用户提交的字段数据):def validate_name(self,data):if(data老男孩):raise serializers.ValidationError(用户名不能是老男孩)# 验证完成以后务必要返回字段值return data2.4.3 全局钩子 在序列化器中需要同时对多个字段进行比较验证时可以定义validate方法来验证 class StudentSerializer(serializers.Serializer):学生数据序列化器...# 方法名时固定的,用于验证多个字段,参数就是实例化序列化器类时的data参数def validate(self,data):name data.get(name)if(name python):raise serializers.ValidationError(用户名不能是python)age data.get(age)if(age0):raise serializers.ValidationError(年龄不能是0)# 验证完成以后务必要返回datareturn data2.4.4 自定义检验函数 在字段中添加validators选项参数也可以补充验证行为 def check_age(age):if age 50:raise serializers.ValidationError(年龄不能刚好是50)return ageclass StudentSerializer(serializers.Serializer):# 需要转换的字段声明# 小括号里面声明主要提供给反序列化使用的name serializers.CharField(requiredTrue, max_length20)age serializers.IntegerField(max_value150, min_value0,requiredTrue,validators[check_age])sex serializers.BooleanField(defaultTrue)description serializers.CharField(requiredFalse,allow_nullTrue, allow_blankTrue)3 序列化器 保存和修改数据库 前面的验证数据成功后,我们可以使用序列化器来完成数据反序列化的过程.这个过程可以把数据转成模型类对象. 3.1 保存和修改方式 首先我们可以在views中直接写上保存数据的代码 # views.py 方式一 from django.http import JsonResponse from django.views import View from .serializers import StudentSerializer from students.models import Student class StudentView(View):def post(self,request):添加一个学生# 接受参数post_data request.POSTdata {name:post_data.get(name),age:post_data.get(age),sex:post_data.get(sex),description:post_data.get(description),}serializer StudentSerializer(datadata)serializer.errors result serializer.is_valid(raise_exceptionTrue)print( 验证结果:%s % result )print( serializer.validated_data ) student Student.objects.create(nameserializer.validated_data.get(name),ageserializer.validated_data.get(age),sexserializer.validated_data.get(sex))print(student)return JsonResponse({message: ok})还可以通过序列化器提供的create()和update()两个方法来实现。 from rest_framework import serializers from students.models import Studentclass StudentSerializer(serializers.Serializer):# 需要转换的字段声明# 小括号里面声明主要提供给反序列化使用的name serializers.CharField(requiredTrue, max_length20)age serializers.IntegerField(max_value150, min_value0,requiredTrue)sex serializers.BooleanField(defaultTrue)description serializers.CharField(requiredFalse,allow_nullTrue, allow_blankTrue) #requiredFalse,# 添加和更新代码# 序列化器中会提供了两个方法: create 和 update,方法名是固定的def create(self, validated_data): # validated_data 参数,在序列化器调用时,会自动传递验证完成以后的数据student Student.objects.create(nameself.validated_data.get(name),ageself.validated_data.get(age),sexself.validated_data.get(sex))return studentdef update(self,instance,validated_data): #instance表示当前更新的记录对象更新学生信息instance.namevalidated_data.get(name)instance.sexvalidated_data.get(sex)instance.agevalidated_data.get(age)instance.descriptionvalidated_data.get(description)# 调用模型的save更新保存数据instance.save()return instance实现了上述两个方法后在视图中调用序列化器进行反序列化数据的时候就可以通过save()方法返回一个数据对象实例了 from django.http import JsonResponse from django.views import View from .serializers import StudentSerializer from students.models import Student class StudentView(View):def put(self,request):更新学生信息# 接受参数data {id:9,name:abc,age:18,sex:1,description:测试,}# 获取要修改的数据instance Student.objects.get(pkdata.get(id))# 调用序列化器serializer StudentSerializer(instanceinstance,datadata)# 验证serializer.is_valid(raise_exceptionTrue)# 转换成模型数据 如果是添加自动会调用create更新就自动调用updatestudent serializer.save()return JsonResponse({message: ok})如果创建序列化器对象的时候没有传递instance实例则调用save()方法的时候create()被调用相反如果传递了instance实例则调用save()方法的时候update()被调用。 3.2 说明 1 在对序列化器进行save()保存时可以额外传递数据这些数据可以在create()和update()中的validated_data参数获取到 # request.user 是django中记录当前登录用户的模型对象 serializer.save(owneruser)2默认序列化器必须传递所有required的字段否则会抛出验证异常。但是我们可以使用partial参数来允许部分字段更新只检验传来的数据 # 更新学生的部分字段信息当数据库允许为空但是序列化器要求必须字段填写的时候可以使用以下方式避开 serializer StudentSerializer(instanceinstance, datadata, partialTrue)把上面序列化器子应用sers和反序列化器子应用users里面的序列化器进行对比。 from rest_framework import serializersclass StudentSerializer(serializers.Serializer):学生信息序列化器# 1. 需要进行数据转换的字段id serializers.IntegerField()name serializers.CharField()age serializers.IntegerField()sex serializers.BooleanField()description serializers.CharField()from rest_framework import serializers from students.models import Studentclass StudentSerializer(serializers.Serializer):# 需要转换的字段声明# 小括号里面声明主要提供给反序列化使用的name serializers.CharField(requiredTrue, max_length20)age serializers.IntegerField(max_value150, min_value0,requiredTrue)sex serializers.BooleanField(defaultTrue)description serializers.CharField(requiredFalse, allow_nullTrue, allow_blankTrue)# 添加和更新代码# 序列化器中会提供了两个方法: create 和 update,方法名是固定的def create(self, validated_data): # validated_data 参数,在序列化器调用时,会自动传递验证完成以后的数据student Student.objects.create(nameself.validated_data.get(name),ageself.validated_data.get(age),sexself.validated_data.get(sex))return studentdef update(self,instance,validated_data):更新学生信息instance.namevalidated_data.get(name)instance.sexvalidated_data.get(sex)instance.agevalidated_data.get(age)instance.descriptionvalidated_data.get(description)# 调用模型的save更新保存数据instance.save()return instance可以发现反序列化器中的代码会包含了序列化器中的大部分代码除了ID字段的声明。 所以在开发的时候我们一般都是直接写在一起那么有些字段只会出现在序列化器阶段例如ID。还有些字段只会出现在反序列化阶段例如用户密码。 那么 我们需要在序列化器类中声明那些字段是在序列化时使用哪些字段在反序列化中使用了。 最终序列化器中的代码 from rest_framework import serializers from students.models import Studentclass StudentSerializer(serializers.Serializer):# 需要转换的字段声明# 小括号里面声明主要提供给反序列化使用的idserializers.IntegerField(read_onlyTrue) #read_onlyTrue读取数据时能读出来反序列化校验数据的时候不需要校验。name serializers.CharField(requiredTrue, max_length20)age serializers.IntegerField(max_value150, min_value0,requiredTrue)sex serializers.BooleanField(defaultTrue,write_onlyTrue)#write_onlyTrue读取数据时不能读出来。但是反序列化校验数据保存时需要传给我们的序列化器description serializers.CharField(requiredTrue, allow_nullTrue, allow_blankTrue)# 添加和更新代码# 序列化器中会提供了两个方法: create 和 update,方法名是固定的def create(self, validated_data): # validated_data 参数,在序列化器调用时,会自动传递验证完成以后的数据student Student.objects.create(nameself.validated_data.get(name),ageself.validated_data.get(age),sexself.validated_data.get(sex))return studentdef update(self,instance,validated_data):更新学生信息instance.namevalidated_data.get(name)instance.sexvalidated_data.get(sex)instance.agevalidated_data.get(age)instance.descriptionvalidated_data.get(description)# 调用模型的save更新保存数据instance.save()return instance4. 模型类序列化器 如果我们想要使用序列化器对应的是Django的模型类DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。 ModelSerializer与常规的Serializer相同但提供了 基于模型类自动生成一系列字段基于模型类自动为Serializer生成validators比如unique_together包含默认的create()和update()的实现 子应用下创建一个StudentModelSerializer.py 文件 from rest_framework import serializers from students.models import Student class StudentModelSerializer(serializers.ModelSerializer):# 字段声明# 如果模型类序列化器,必须声明本次调用是哪个模型,模型里面的哪些字段class Meta:model Student # model 指明参照哪个模型类fields [id,name,age,description,sex]# fields __all__ # 表示操作模型中的所有字段# 添加额外的验证选项exclude [id,] # 排除字段extra_kwargs {sex:{write_only:True,},id:{read_only:True,}}4.1 可用字段 使用fields来明确字段__all__表名包含所有字段也可以写明具体哪些字段如 class StudentModelSerializer(serializers.ModelSerializer):学生数据序列化器class Meta:model Studentfields [id, age, name,description]使用exclude可以明确排除掉哪些字段 class StudentModelSerializer(serializers.ModelSerializer):学生数据序列化器class Meta:model Studentexclude [sex]指明只读字段[少用,通过extra_kwargs更方便一些 可以通过read_only_fields指明只读字段即仅用于序列化输出的字段 class StudentModelSerializer(serializers.ModelSerializer):学生数据序列化器class Meta:model Studentfields [id, age, name,description]read_only_fields (id,)#write_only_fields (sex,)额外参数extra_kwargs 我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数 from rest_framework import serializers from students.models import Student class StudentModelSerializer(serializers.ModelSerializer):# 额外字段声明,必须在fields里面也要声明上去,否则序列化器不会调用password serializers.CharField(write_onlyTrue,requiredTrue) #加上write_only的字段可以直接删除# 如果模型类序列化器,必须声明本次调用是哪个模型,模型里面的哪些字段class Meta:model Student# fields [id,name,age,description,sex,password]fields [id,name,age,description,sex]# fields __all__ # 表示操作模型中的所有字段# 添加额外的验证选项比如额外的字段验证extra_kwargs {sex:{write_only:True,},id:{read_only:True,}}示例接收额外参数进行检验但不保存 # serializers.py from rest_framework import serializers from ser import models class StudentModelSerializer(serializers.ModelSerializer):password serializers.CharField(max_length5) # 接收额外passwordclass Meta:model models.Studentfields [name, age, password,class_null,sex, description]extra_kwargs {id:{read_only:True},name:{max_length:5,# 定制错误信息error_messages: {max_length:name不能超过5个字符,},# 自定义校验函数# validators:[]},}# 局部钩子def validate_password(self,data):if 666 in data:raise serializers.ValidationError(密码里不能含有666)return data# views.py from django.shortcuts import render from rest_framework.views import APIView from ser import models from mser.serializers import StudentModelSerializer from django.http import JsonResponseclass StudentsView(APIView):def get(self,request):all_student models.Student.objects.all() #[{},]serializer_obj StudentModelSerializer(instanceall_student,manyTrue)return JsonResponse(serializer_obj.data,safeFalse)def post(self,request):serializer_obj StudentModelSerializer(datarequest.data)print(serializer_obj.is_valid())if serializer_obj.is_valid():print(,serializer_obj.validated_data)# 保存之前进行删除serializer_obj.validated_data.pop(password)obj serializer_obj.save()new_obj StudentModelSerializer(instanceobj)return JsonResponse(new_obj.data)else:print(serializer_obj.errors)return JsonResponse({error:校验失败})
http://www.pierceye.com/news/356326/

相关文章:

  • 东莞seo网站推广建设抖音开放平台注册
  • 怎么做淘宝客采集网站建设局考试通知文件网站
  • 百度云网站建设视频教程超市网站设计
  • 主机屋 建网站教程wordpress收费会员插件
  • 天津网站建设的公司哪家好shopify和wordpress
  • 网站设计风格评价天元建设集团有限公司 伊永成
  • 望都网站建设山东的互联网公司都有什么
  • 开发一个网站需要多少人邢台网站建设服务商
  • 钦州建设局网站seo网站关键词优化机构
  • 北京工程信息网站网站建设及管理使用情况汇报
  • 网页网站原型图占位符怎么做公司宣传策划方案
  • 企业网站颜色选择wordpress自然志下载
  • 介绍几个网站重庆网站建设微信开发
  • wordpress小工具跟随最新外贸seo
  • 网站域名的密码电子商务网站策划书3500字
  • 2008 iis 添加 网站 权限设置权限网站开发工程师题
  • 公司域名查询网站网页设计工具软件有哪些
  • 毕业设计网站建设选题依据设计公司网站应该包括的信息
  • wordpress 仪表板主题seo网站排名厂商定制
  • 网站建设成本报表wordpress缺点
  • 外贸建站选择哪个服务器好免费自动生成二维码
  • 建设部申请自己网站c 做网站设计
  • 软件制作网站网站维护合同模板
  • 那家财经网站做的好陕西网站建设公司哪有
  • 淄川网站建设中小型企业网站建设
  • phpcms 投资 网站源码wordpress主题网站
  • 聊城网站托管义乌外贸公司联系方式
  • 开发一个小程序对网站做综合搜索引擎优化分析
  • 网站开发自学网有哪些企业可以做招聘的网站有哪些
  • 网站怎么做百度推广网站开发者模式