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

网站规划建设江浙沪做网站的公司

网站规划建设,江浙沪做网站的公司,wordpress设置导航菜单显示位置,免费网站申请域名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.eeditor.cn/news/124481/

相关文章:

  • 郑州服装网站建设做网站去哪个平台
  • 昆明网站建设首选互维章丘网站优化
  • wap网站制作成都网站优化排名推广
  • 专业免费网站建设一般手机wap网站多少钱
  • 安徽省建设厅门户网站邢台专业网站建设费用
  • 医院网站备案流程模板板网站
  • 如何申请域名建网站2022百度指数排名
  • 广东建设网站公司wordpress示例页面在哪删除
  • 资讯类网站开发文档郑州小程序开发公司排名
  • 八年级学生做的简易网站网站开发后端书籍
  • 收录很快的推广网站沧州做网站哪家公司好
  • 崇明网站建设深喘旋磨做紧夹断妖精网站
  • 郑州三牛网站建设个人网站怎么设计首页
  • 怎样建设打字网站个人淘宝客网站有哪些
  • 做网站 租服务器阳谷做网站推广
  • 国外网站阻止国内访问怎么做做cad模板下载网站
  • 深圳网站定制建设手机网站 微信分享
  • 宁波市城市建设档案馆网站建设工程质量监理协会网站
  • 商丘企业网站建设服务广西桂林自驾游最佳线路推荐
  • 成都微信网站建设报价国外人像摄影网站
  • 百度云域名买了之后建设网站360免费网站空间
  • 手机兼职平台网站开发建站流程
  • 网站营销目标智慧团建怎么转团关系
  • 制作公司网站设计手绘杭州网站建设icp备
  • php餐饮网站青岛神马排名优化
  • 越秀网站建设价格杭州seo薪资水平
  • 毕业设计做app还是做网站网站备案网站名称
  • 网站开发公司挣钱吗海淘网站主要关键词
  • 网站开发 方案 报价如何做转运网站
  • 自己做网站挣钱吗做网络推广为什么会被抓