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

2008r2做网站网站系统怎么做的

2008r2做网站,网站系统怎么做的,测量为什么要建站,不备案怎么做淘宝客网站吗系列文章目录 Django入门全攻略#xff1a;从零搭建你的第一个Web项目Django ORM入门指南#xff1a;从概念到实践#xff0c;掌握模型创建、迁移与视图操作Django ORM实战#xff1a;模型字段与元选项配置#xff0c;以及链式过滤与QF查询详解Django ORM深度游#xff… 系列文章目录 Django入门全攻略从零搭建你的第一个Web项目Django ORM入门指南从概念到实践掌握模型创建、迁移与视图操作Django ORM实战模型字段与元选项配置以及链式过滤与QF查询详解Django ORM深度游探索多对一、一对一与多对多数据关系的奥秘与实践跨域问题与Django解决方案深入解析跨域原理、请求处理与CSRF防护Django视图层探索GET/POST请求处理、参数传递与响应方式详解Django路由与会话深度探索静态、动态路由分发以及Cookie与Session的奥秘Django API开发实战前后端分离、Restful风格与DRF序列化器详解Django REST framework序列化器详解普通序列化器与模型序列化器的选择与运用还在写0.0… 文章目录 系列文章目录前言一、普通序列化器-Serializer1. 普通序列化器编写方式2. 普通序列化器序列化3. 普通序列化器反序列化创建4. 普通序列化器反序列化更新5. 普通序列化器完整代码 二、模型序列化器-ModelSerializer1. 模型序列化器编写方式2. 模型序列化器反序列化创建、更新3. 模型序列化器与普通序列化器的对比 前言 在 Django REST framework 中数据序列化至关重要。本文将探讨 普通序列化器 和 模型序列化器了解它们的基本功能和差异帮助您根据项目需求选择合适的序列化器。 Response是不能直接返回ORM数据的所以需要我们进行序列化操作可以通过手动将其转为字典或JSON也可以使用DRF所提供的序列化器一般建议使用序列化器。 如果你经常使用的是自己去将数据封装为JSON那么常见的代码模型就像这样 data models.objects.all() json_data {} for d in data:json_data[age] d.agejson_data[name] d.name return Response(json_data)随字段越来越多工作量会越来越大而且有关于时间(DateTimeField、DateField)等字段类型的序列化直接通过JSON也是不行的需要自己手动编写JSON的序列化器非常麻烦于是乎 DRF 就提供了更为便捷的两种序列化器普通序列化器与模型序列化器 一、普通序列化器-Serializer 1. 普通序列化器编写方式 导包from rest_framework import serializers 普通序列化器可以按照给定字段将所匹配的ORM数据字段转换为JSON数据不光可以对一条数据也可以对一个QuerySet所对应的结果集 例如 用户表 UserModel #models.py from django.db import models# Create your models here. class UserModel(models.Model):name models.CharField(max_length50)phone models.CharField(max_length11)password models.CharField(max_length30)info models.CharField(max_length100, nullTrue)def __str__(self):return self.nameclass Meta:db_table user普通序列化器UserSerializer定义如下 #userSerializer.py class UserSerializer(serializers.Serializer):name serializers.CharField(max_length50)phone serializers.CharField(validators[validators_phone])password serializers.CharField(max_length30)info serializers.CharField(max_length100,default默认值)序列化器的使用分两个阶段 1、在客户端请求时使用序列化器可以完成对数据的反序列化将字典格式的数据转化为模型对象。 2、在服务器响应时使用序列化器可以完成对数据的序列化将模型对象转化为字典格式的数据。 2. 普通序列化器序列化 序列化就是将ORM数据放入序列化器加工诞生出JSON数据对象序列化器对象的data属性即为处理好的 JSON 数据对象 1、单条数据的序列化 单挑数据的序列化很简单直接通过序列化器类对象的参数instance传入查询得到的结果即可 #views.py class UserIdView(APIView):def get(self, request, id):user UserModel.objects.get(pkid)usSer UserSerializer(instanceuser)return Response({message: get测试成功, data: usSer.data}) 2、多条数据的序列化 如果使用像filter、all这样的一些ORM方法获取到的是QuerySet结果集不是单独数据对象那么使用序列化器时需要传入manyTrue参数用来表示传入的不止一条数据。 #views.py class UserView(APIView):def get(self, request):users UserModel.objects.all()usSer UserSerializer(instanceusers, manyTrue)return Response({message:get测试成功,data:usSer.data}) Serializer属性中选项参数 选项参数名称作用max_length最大长度min_length最小长度allow_blank是否允许为空trim_whitespace是否截断空白字符max_value最大值min_value最小值 通用参数名称作用read_only该字段仅用于序列化输出需要序列化输出时设置read_onlyTrue;默认为Falsewrite_only该字段仅用于反序列输入需要序列化输入时设置write_onlyTrue;默认为Falserequired该字段表示在反序列化输入时必须输入default反序列化时使用的默认值allow_null表明该字段是否允许传入None默认Falsevalidators对字段进行校验定义在字段中error_message当字段校验不通过时报error_message的value值label用于HTML展示API页面时显示的字段名称help_text用于HTML展示API页面时显示的字段帮助提示信息 3. 普通序列化器反序列化创建 反序列化的概念很简单就是把JSON等数据变为ORM数据对象甚至是入库或者是修改 DRF要求序列化器必须对数据进行校验才能获取验证成功的数据或保存成模型类对象 在操作过程中反序列化首先需要通过data 传参接着调用is_valid进行校验验证成功返回True反之返回False 如果校验失败还可以通过结果的errors 属性返回错误值is_valid调用后方法会进行字段属性(max_value10)的校验、自定义的校验等等 对校验过后的对象调用save方法这个save方法会触发序列化器中的create方法 普通序列化器中create方法默认是没有实现的需要手动根据模型类进行编写 如果需要自定义校验规则可以通过validators实现 #userSerializer.py from rest_framework import serializers from app.models import UserModel import redef validators_phone(values):r_phone r^1[3-9]\d{9}$if re.match(r_phone, values):print(手机号匹配成功)else:print(手机号匹配失败抛出异常)raise serializers.ValidationError(手机号匹配失败不满足规则)class UserSerializer(serializers.Serializer):name serializers.CharField(max_length50)phone serializers.CharField(validators[validators_phone])password serializers.CharField(max_length30)info serializers.CharField(max_length100,default默认值)比如现在需要提交数据用到创建User的接口此时可以这么做 为了能够保证数据成功入库默认的普通序列化器是不具备入库功能的需要编写create方法 #userSerializer.py class UserSerializer(serializers.Serializer):name serializers.CharField(max_length50)phone serializers.CharField(validators[validators_phone])password serializers.CharField(max_length30)info serializers.CharField(max_length100,default默认值)def create(self, validated_data):object UserModel.objects.create(**validated_data)return object#具体来说**validated_data的作用是解包字典。 #它将validated_data字典中的键值对解包为一系列的关键字参数。成功之后就可以通过像之前一样的数据提交编写视图完成数据入库序列化器可以直接处理request所提交的数据data并且可以剔除在request.data中其他多余的字段只会处理序列化器里的字段 # views.py class UserView(APIView):def post(self, request):ser UserSerializer(datarequest.data) # 传参data进行反序列化if ser.is_valid():print(校验成功)ser.save()return Response({message:[POST]信息添加成功})else:print(校验失败)return Response({message: ser.errors})4. 普通序列化器反序列化更新 反序列化经过校验的数据不光可以用来创建数据还可以用来更新数据 更新首先需要一个已经存在的数据所以需要通过instance参数传递已有的一个ORM对象还需要待更新的新值那么就需要传data参数之后同样需要is_valid方法调用检查即将更新进入的数据是否合法最终save触发序列化器中的update方法 默认普通序列化器是没有自带对于数据的更新方法的现在需要在序列化器里创建update方法 # userSerializer.py class UserSerializer(serializers.Serializer):name serializers.CharField(max_length50)phone serializers.CharField(validators[validators_phone])password serializers.CharField(max_length30)info serializers.CharField(max_length100,default默认值)def update(self, instance, validated_data):# instance 要更新的数据validated_data 是新数据instance.name validated_data.get(name, instance.name)instance.phone validated_data.get(phone, instance.phone)instance.password validated_data.get(password, instance.password)instance.info validated_data.get(info, instance.info)instance.save()return instance#获取字段值 #validated_data.get(name) 尝试从 validated_data 字典中获取键为 name 的值。 #validated_data 是由序列化器在验证请求数据后生成的一个字典它包含了经过验证的字段和它们的值。#默认值机制 #get 方法有一个可选的第二个参数即默认值。如果 name 这个键不存在于validated_data 中get 方法将返回这个默认值。 #在这个例子中如果请求数据中没有包含 name 字段那么默认值就是 instance.name即当前模型实例的 name 字段的值。然后通过PUT传递要更新数据的ID以及更新后的值来为某条数据更新 class UserIdView(APIView):def put(self, request, id):user UserModel.objects.get(pkid)ser UserSerializer(instanceuser, datarequest.data)if ser.is_valid():print(校验成功)ser.save()return Response({message: [PUT]信息修改成功})else:print(校验失败)return Response({message: ser.errors})5. 普通序列化器完整代码 models.py from django.db import models# Create your models here. class UserModel(models.Model):name models.CharField(max_length50)phone models.CharField(max_length11)password models.CharField(max_length30)info models.CharField(max_length100, nullTrue)def __str__(self):return self.nameclass Meta:db_table useruserSerializer.py from rest_framework import serializers from app.models import UserModel import redef validators_phone(values):r_phone r^1[3-9]\d{9}$if re.match(r_phone, values):print(手机号匹配成功)else:print(手机号匹配失败抛出异常)raise serializers.ValidationError(手机号匹配失败不满足规则)class UserSerializer(serializers.Serializer):name serializers.CharField(max_length50)phone serializers.CharField(validators[validators_phone])password serializers.CharField(max_length30)info serializers.CharField(max_length100,default默认值)def create(self, validated_data):object UserModel.objects.create(**validated_data)return objectdef update(self, instance, validated_data):# instance 要更新的数据validated_data 是新数据instance.name validated_data.get(name, instance.name)instance.phone validated_data.get(phone, instance.phone)instance.password validated_data.get(password, instance.password)instance.info validated_data.get(info, instance.info)instance.save()return instanceviews.py from rest_framework.views import APIView from rest_framework.response import Response from app.models import UserModel from app.serializer.userSerializer import UserSerializer from django.shortcuts import render# Create your views here.class UserView(APIView):def get(self, request):users UserModel.objects.all()usSer UserSerializer(instanceusers, manyTrue)return Response({message:get测试成功,data:usSer.data})def post(self, request):ser UserSerializer(datarequest.data) # 传参data进行反序列化if ser.is_valid():print(校验成功)ser.save()return Response({message:[POST]信息添加成功})else:print(校验失败)return Response({message: ser.errors})class UserIdView(APIView):def get(self, request, id):user UserModel.objects.get(pkid)usSer UserSerializer(instanceuser)return Response({message: get测试成功, data: usSer.data})def put(self, request, id):user UserModel.objects.get(pkid)ser UserSerializer(instanceuser, datarequest.data)if ser.is_valid():print(校验成功)ser.save()return Response({message: [PUT]信息修改成功})else:print(校验失败)return Response({message: ser.errors})urls.py from django.urls import path from app.views import UserView,UserIdViewurlpatterns [path(user/, UserView.as_view()),path(user/int:id/, UserIdView.as_view()), ] 二、模型序列化器-ModelSerializer 1. 模型序列化器编写方式 之前的普通序列化器很明显可以感觉到如果模型类字段少了还行但是模型字段越来越多那么开发者在序列化器里所要复刻的字段也要越来越多很麻烦 而且还得手动实现update和create方法而且光写了序列化器字段还不行还得有字段属性 于是乎有了现在的与模型类关联的序列化器可以更加方便的进行字段映射以及内置方法的编写 模型类关联序列化器大概总结有如下三个特性一个缺点 特点 基于模型类自动生成一系列字段自动生成的系列字段同时还包含unique、max_length等属性校验包含默认的create和update的实现 缺点 不会自动映射模型类字段的default属性 模型类关联的序列化器用的是新的序列化器基类 from rest_framework.serializers import ModelSerializer用户模型类依旧使用上文中的UserModel.py文件 按照之前的普通序列化写法你需要同步一个字段并将字段属性也要记得同步非常麻烦,但通过与模型类关联的序列化器就很简单了。 首先通过继承ModelSerializer基类通过序列化器元类属性中的model属性关联模型类通过序列化器元类属性中的fields属性指明序列化器需要处理的字段 # userModelSerializer.py from rest_framework import serializers from app.models import UserModelclass UserModelSerializer(serializers.ModelSerializer):# 不需要再重写 create 和 update 方法了可查看ModelSerializer源码class Meta:model UserModelfields __all__ # 指明所有模型类字段# exclude (password,) # 排除掉的字段# read_only_fields (name,info) # 只用于序列化的字段# fields (name,phone,password,info)# extra_kwargs {# info:{min_length:5, required:True},# } #修改原有字段的选项参数模型类关联的序列化器和普通的序列化器使用方法一样使用序列化器返回当前所有的商品数据还是像之前一样传入instance参数即可还要记得由于是多个商品不是单独数据要记得加manyTrue参数 2. 模型序列化器反序列化创建、更新 模型序列化器的创建就更简单了不需要手动实现create方法大致流程如下 为序列化器绑定数据serSerializer(datarequest.data)校验数据ser.is_valid()存储入库ser.save() 创建用户接口 from rest_framework.views import APIView from rest_framework.response import Response from app.models import UserModel from app.serializer.userModelSerializer import UserModelSerializer# Create your views here.class UserView(APIView):def get(self, request):users UserModel.objects.all()usSer UserModelSerializer(instanceusers, manyTrue)return Response({message:get测试成功,data:usSer.data})def post(self, request):ser UserModelSerializer(datarequest.data) # 传参data进行反序列化if ser.is_valid():print(校验成功)ser.save()return Response({message:[POST]信息添加成功})else:print(校验失败)return Response({message: ser.errors})注意 反序列化自动生成的字段属性中不会包含原始模型类字段中的default字段属性 更细用户信息接口 更新某一个商品数据模型序列化器也是自带了update方法 class UserIdView(APIView):def get(self, request, id):user UserModel.objects.get(pkid)usSer UserModelSerializer(instanceuser)return Response({message: get测试成功, data: usSer.data})def put(self, request, id):user UserModel.objects.get(pkid)ser UserModelSerializer(instanceuser, datarequest.data)if ser.is_valid():print(校验成功)ser.save()return Response({message: [PUT]信息修改成功})else:print(校验失败)return Response({message: ser.errors})3. 模型序列化器与普通序列化器的对比 序列化时将模型类对象传入instance参数 序列化结果使用序列化器对象的data属性获取得到 反序列化创建时将要被反序列化的数据传入data参数 反序列化一定要记得先使用is_valid校验 反序列化更新时将要更新的数据对象传入instance参数更新后的数据传入data参数模型序列化器比普通序列化器更加方便自动生成序列化映射字段create、update方法等关联外键序列化字段属性外键为多时要记得加manyTrue
http://www.laogonggong.com/news/137427.html

相关文章:

  • 网站建设项目方案模板网站改版推荐
  • 网站建设的扩展阶段包括网站域名怎么修改
  • 网站开发类标书报价明细表韩国跨境电商有哪些平台
  • 做网站遇到的问题及解决方法网站开发用原生
  • 双公示 网站专栏建设常见的cms网站
  • flsah在网站开发中的作用discuz做的网站
  • 长春网站架设用thinkcmf做的网站
  • 南山网站设计国际军事新闻最新消息今天
  • 邵阳公司网站建设wordpress邮箱备份
  • 宛城区网站建设预付网站建设费用怎么做分录
  • 网站建设仟首先金手指12wordpress 头像打岔
  • 网上销售怎样做网站网站未备案做经营被罚款
  • 中铝长城建设有限公司网站微信卖水果链接网站怎么做的
  • 厦门网盛网站开发小程序打包成app
  • 网站建设对企业的影响手机集团网站建设
  • 对于网站建设的提问好多职业培训网站是怎么做的
  • 广州三合一网站建设微信小程序定制开发需要多少钱
  • 网站导航设计图片知末网官网
  • wordpress 如何仿站免费海外ip地址
  • 宿迁网站建设电话wordpress源码学习
  • 余姚 网站建设网站整站源码下载
  • 电子商务网站建设实习报告济南网站制作服务
  • 临沧永德网站建设电子商务公司腾讯云服务器app
  • 巩义网站建设案例课堂iis上部署手机网站
  • 手机站建设网站外链建设周期
  • 漯河网站seowordpress 营销
  • 贵阳做网站多少钱重庆集团网站建设
  • 西安新能源网站建设wordpress去除底部
  • 福建省住房和城乡建设网站百度广告投放公司
  • 站长之家源码之家住房和城乡建设部网站造价师