提到序列化与反序列化,通常会想到 json ,xml .在J2EE的开发中,这是很常用的技术,比如一个java class与xml之间的序列化与反序列化,我们可以通过 xstream来实现,如果是与json...但现在的问题是,这个json包不能序列化 django 的models 里面的对象的实例。 经过分析,网络搜索,发现有如下解决方案....,因为 SomeModel.objects.get(id=myid) 返回的是一个具体的实例,而不是一个集合对象,因此是不可以 iterable 的。...一般来说,从网络得回的POST(或者GET) 参数中所包含json数据 例如,用POST传过来的参数中有一个key value键值对为 request.POST...这样一来就可以很好的使用配合SimpleJson和Django来完成序列化工作了 2.直接利用python 2.7 提供的json包,或者用simplejson都可以 首先,你需要在django model
验证失败,可以通过序列化器对象的 errors 属性获取错误信息,返回一个字典, 包含字段和字段的错误,若是非字段错误,可以通过修改 REST framework 配置中的 NON_FIElD_ERRORS_KEY...("图书不是关于Django的") return value 2) validate 在序列化器中需要同时对多个字段进行比较验证时,可以定义 validate 方法进行验证 class...中的 request.POST 包含了解析之后的文件和非文件数据 包含了对POST、PUT、PATCH请求方式解析后的数据 利用了REST framework的parsers解析器,不仅支持表单类型数据...APIView与View的不同之处在于: 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象; 视图方法可以返回REST framework...在APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。
和POST请求的接口写法,下面我们来完成PUT、DELETE、GET查看单条数据的几个接口。...需要注意,如果在 ModelSerializer 和HyperlinkedModelSerializer中如果models.DateTimeField带有auto_now=True或者auto_add_now...一种常见的使用场景就是在Model中存在user_id作为外键,在用户提交时,不允许提交user_id,但user_id在定义Model时又是必须字段,这种情况下就可以使用HiddenField提供一个默认值...等基础校验之外,还会会根据咱们写的这个序列化组件中设置的字段中有read_only=True属性的字段排除掉,这也是为什么我们在面写多对多和一对多字段时,如果字段名称和model表中多对多或者一对多的字段名称相同...() serializer_class = PublishSerializers # def get(self,request,id):#id就不需要传了,因为人家要求在url中添加的命名分组的
2 解析器组件 (用来解析数据的请求的组件) Django并不能处理请求协议为application/json编码协议的数据 注意: DRF解析器会封装到View中的parsers内,在视图函数被调用时...定义需要返回的字段(字段类型可以与model中的类型不一致,参数也可以调整),字段名称必须与model中的一致 在GET接口逻辑中,获取QuerySet 开始序列化:将QuerySet作业第一个参数传给序列化类...,many默认为False,如果返回的数据是一个列表嵌套字典的多个对象集合,需要改为many=True 返回:将序列化对象的data属性返回即可 {{ 实践代码 }} --post接口设计 url...定义:需要为post新增url,因为根据规范,url定位资源,http请求方式定义用户行为 定义post方法:在视图类中定义post方法 开始序列化:通过我们上面定义的序列化类,创建一个序列化对象,传入参数...返回结果 5 认证组件 cookie和session两种方式可以保存用户信息,这两种方式不同的是cookie保存在客户端浏览器中,而session保存在服务器中,他们各有优缺点,配合起来使用,可将重要的敏感的信息存储在
serializers.fieild 我们知道在django中,form也有许多field,那serializers其实也是drf中发挥着这样的功能。我们先简单了解常用的几个field。...,我们在django中,form更强调对提交的表单进行一种验证,而serializer的field不仅在进行数据验证时起着至关重要的作用,在将数据进行序列化后返回也发挥着重要作用!...,我觉得用的很好,一眼看出,这是为post和patch所设置的,没错,这一部分功能是专门为这两种请求所设计的,如果只是简单的get请求,那么在设置了前面的field可能就能够满足这个需求。...我们在mixins的博客中提及到,post请求对应create方法,而patch请求对应update方法,这里提到的create方法与update方法,是指mixins中特定类中的方法。...就更简单了,直接通过映射就好了 不过这样只是用户获得的只是一个外键类别的id,并不能获取到详细的信息,如果想要获取到具体信息,那需要嵌套serializer category = CourseCategorySerializer
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。...from django.views.decorators.http import require_GET 另外还是以下几种限制 HTTP 请求方法的装饰器。...require_GET() 只允许视图接受 GET 方法的装饰器。 require_POST() 只允许视图接受 POST 方法的装饰器。...require_safe() 只允许视图接受 GET 和 HEAD 方法的装饰器。 这些方法通常被认为是安全的。...p # 指定默认参数 1 page = int(request.GET.get('p', 1)) category_id = int(request.GET.get('category_id
开发的异同时说过,django-rest-framework 开发和传统的开发方式没有什么不同,区别仅在于返回的数据格式不同而已。...在基于模板引擎的开发方式中,博客首页文章列表的视图函数可能是这样的: from django.shortcuts import render from .models import Post def..., 'blog/index.html', context={'post_list': post_list}) 在 django-rest-framework,代码逻辑是一样的,只是在最后返回结果时,返回资源序列化后的结果...在转换过程中,还会进行数据合法性的校验。 先来看一个简单的例子(摘自 django-rest-framework 官网示例),理解序列化器的工作原理和功能。...被序列化对象序列化后的数据是一个扁平的 Python 字典,字典中的数据描述了这个对象资源。
一、商品类别数据接口 由之前的效果图和需求分析可知,首页全部商品分类需要展示一级、二级和三级分类,而在搜索结果页只展示一级和二级分类,分类有两个Vue组件,即Header中的全部商品分类和左侧的某以及类别对应的分类导航栏...此时,以嵌套的形式在父类别中显示出子类别,并且属于三层嵌套。...显然,此时地址中传入指定的id,只显示该id对应的类别的信息和其子类别的信息。...在前端项目fresh_online中,在src/api/api.js中定义了数据API接口: import axios from 'axios'; let host = 'http://shop.projectsedu.com...= params => { return axios.get(`${local_host}/goods/`, { params: params }) } 同时,向后端请求的参数有一个为top_category
blank 和 null 在 serializer 中为 allow_blank 和 allow_null,其余类似,可以参考 django model 部分的设置参数。...) 3 创建 rest 的 view 函数 rest_framework 类似 django,需要通过 view 来展示接口返回的数据信息,在 views.py 中创建视图函数 from django.views.decorators.csrf...', 'modified_time', 'excerpt'] # exclude 为不展示的字段名,和 fields 不能同时设置 # exclude = ['id',...接着我们需要来操作对某篇具体的 post 进行信息修改,那就涉及到了 post 的 id,还记得我们在 django 部分如何操作这种 url 的么,忘记了往前翻翻......接着我们通过一个 detail...# 首先我们在 model 中增加两个链表结构字段,同时创建相关的 model 并生成数据库 class PostModel(models.Model): # ....
资源只能是名词不能是动词,而且名词往往和数据库的表名相对应。同时,利用HTTP方法(post, get, put, delete)可以分离网址中资源名称的操作。...#获取信息 请求方法(HTTP动词) URI 解释 GET /students/ 获取所有学生 POST /students/ 新建一个学生 GET /students/ID/ 获取指定ID的学生信息...DRF中封装了Serializer类和ModelSerializer类用于实现序列化操作,通过继承Serializer类或ModelSerializer类,我们可以自定义序列化器,用于将对象处理成字典,...在Group和User中,我们使用的是HyperlinkedModelSerializer的超链接关系。您也可以使用主键和各种其他关系,但是超链接是很好的RESTful设计。...4.在polls2的views.py中添加restful风格的函数 5.在urls.py中配置url映射 6.在static/html中新建前端页面 7.运行测试
去处理 # 2)判断处理的结果(返回值)response,有值代表drf已经处理了,None代表需要自己处理 # 自定义异常处理文件exception,在文件中书写exception_handler函数...user_obj = models.User.objects.get(pk=pk) ## 用户对象不能直接作为数据返回给前台 ## 序列化...(self,obj): return obj.get_gender_display()  在序列化过程中,我们可以删除不想显示的字段,就比如说是gender,这样的话,就可以把gender_value...user_obj = models.User.objects.get(pk=pk) ## 用户对象不能直接作为数据返回给前台 ## 序列化...可以将值取出校验 # # 3)为有联合关系的字段们提供全局钩子函数,如果某些字段不入库,可以将值取出校验 # # 4)重写create方法,完成校验通过的数据入库工作,得到新增的对象
get/post/put/delete等请求方法,而只支持action动作 但是 ViewSet类中没有提供 get_object(), get_serializer等方法 继承 viewsets.GenericViewSet...中 View DRF中 APIView GenericAPIView mixins扩展类 CreateAPIView(合并拓展类) 视图集 action和请求方法的映射 ViewSet GenericViewSet...第二个参数viewset为视图集「不要加as_view」 将自动生成的路由添加到列表中 from django.urls import path, includefrom projects import...参数用于指定该动作支持的请求方法,默认为get detail用于指定该动作要处理的是否为详情资源对象「url是否需要传递pk值」 在 url.py中添加 path('project/names/', views.ProjectsViewSet.as_view...: model = Projects fields = ('id', 'name') 在 view中添加 @action(methods=['get'], detail=False
1.视图 2.路由 3.接口测试 一、序列化 1.步骤 model s.py,定义表与字段,及表关系 serializes.py 中序列化与反序列化 views.py 中写 get,post 等操作...Model 不能在数据库中创建表 # 声明基表,设置 abstract = True class Meta: abstract = True class Book(BaseModel...publish = attrs.get('publish') # 这里的外键已经变成对象 name = attrs.get('name') if models.Book.objects.filter...三、序列化与反序列的整合 从数据的安全性和健壮性来考虑,所有的自定义字段不能与 model 的原字段相同 因为序列化是将外键字段作为 Dict,而反序列化会将外键字段作为 Object 1.视图 views.py...model 对应的字典 # 群增,传的数据是装多个 model 对应字典的列表 def post(self, request, *args, **kwargs): request_data
django可以使用restframework快速开发接口,返回前端所需要的json数据,但是有时候利用restframework开发的接口并不能满足所有的需求,这时候就需要自己手动开发接口,也就是将需要用到的某些对象转化为需要使用的...1.定义我们需要的模型类,并且在对应的模型类中定义对应的将对象转化为字典的函数 from django.db import models class Questionnaire(models.Model...类自己定义get方法与post方法处理请求,首先获取到所有的问卷对象,在将每一个问卷对象通过自定义的函数转化为字典,最后返回json数据,同样处理post请求添加问卷时,首先获取到问卷的标题,然后实例化一个问卷的对象...(self,request,*args,**kwargs): '''假设前端通过post传过来一个json数据''' #把request中的json转化为python对象 data = json.loads...请求来获取所有问题的json数据,通过post方法从前端获取到传递过来的json数据,将其转化为对象并保存。
八、商品详情页功能 1、viewsets实现商品详情页接口 商品的轮播图是一个外键,序列化的时候需要用嵌套的方式来实现: 1 class GoodsImageSerializer(serializers.ModelSerializer...id,因为取消收藏的时候必须知道商品的id是多少 23 fields = ('user', 'goods', 'id') 然后在views.py中编写用户收藏的接口,收藏需要继承CreateModelMixin...4、drf的权限验证 在utils下新建permissions.py,这个官网有实例,直接复制过来即可,把其中的owner改为user即可: 1 from rest_framework import...14 lookup_field = 'goods_id' 15 16 # 只能查看当前登录用户的收藏,不会获取所有用户的收藏 17 def get_queryset(self...删除settings中的rest_framework_jwt.authentication.JSONWebTokenAuthentication 5、Vue和用户收藏接口联调 修改Vue前端代码中的
URLField、EmailField和其他整数字段类似,Django将使用url、email和number这样的HTML5输入类型。...对象的用户信息 # 显示用户已经存在数据 if request.method == "GET": user_obj = models.UserInfo.objects.filter(id=nid).first...中,他们都是继承了BaseForm,而is_valid是在BaseForm中定义的,所以ModelForm也能和Form一样使用各种钩子 额外字段 像网页上的checkbox,一个月内免登陆,用提交到数据库么..., 去数据库中获取值 # to_representation,在页面中显示值 # level_name = serializers.CharField(source='get_level_display...(self,obj): pass 在ModelSerializer直接以get_字段的形式 class CouserDetailSerializer(serializers.ModelSerializer
3.商品系列分类展示功能 商品系列分类包括左侧的导航栏和右侧的商品列表,大类对应多个品牌、大类对应多个小类、大类对应多个商品,即包含3个一对多关系,在定义序列化时需要嵌套定义。...为了在创建brand时只显示一级类别,在adminx.py中定义GoodsBrandAdmin类时重写了get_context()方法,其中获取到category字段只取category_type为1的数据...但是同时也可以看到,在商品的image属性的值即图片链接中未自动添加域名,这是因为进行嵌套序列化默认不会添加域名,需要给字段设置context属性,配置如下: class IndexCategorySerializer...销售量一般是在支付成功后更新,所以在apps/trade/views.py中的AliPayView中实现: class AliPayView(APIView): ''' get:...retrieve和list方法,这主要是查询操作,对于新建、修改等操作一般是不能使用缓存的。
13.1.轮播图接口实现 首先把pycharm环境改成本地的,vue中local_host也改成本地 (1)goods/serializer class BannerSerializer(serializers.ModelSerializer...就要添加一个参数context(上下文request),嵌套serializer必须加 # serializer返回的时候一定要加 “.data” ,这样才是json数据...的时候django model都会发送一个信号量出来,用信号量的方式代码分离性更好 收藏数+1和-1 (1)user_operation/signal.py # users_operation/signals.py...from django.db.models.signals import post_save,post_delete from django.dispatch import receiver from...获取GET中参数 for key, value in request.GET.items(): processed_dict[key] = value
2.明确RestAPI接口实现时的主要工作 2.1序列化&反序列化 把程序中的数据结构类型转换为其他格式的数据,这个过程叫做序列化的过程 例:将模型类对象转换为字典或者json数据的过程,就叫做序列化的过程...2.2RestAPI接口核心的工作: 把数据库数据序列化为前端所需要的格式,并返回。 把前端发送的数据反序列化为模型类对象,并保存到数据库中。...Django框架学习中创建的demo工程,在settings.py的INSTALLED_APPS中添加’rest_framework’。...django的路由列表中 4.Serializer序列化器 作用:进行数据的序列化和反序列化 序列化:把对象转换为字典 反序列化:数据校验;数据保存(可以利用这一点实现新增和更新); 4.1使用 定义一个序列化器类...4.5序列化功能(重点掌握) 把实例对象转换为字典数据 知识点: 1、序列化单个对象 2、序列化多个对象 3、关联对象的嵌套序列化 1)将关联对象序列化为关联对象的主键 # 在英雄类(多)中添加 hbook
前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图。...它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Django一般的HttpRequest)对象,并且返回Response(而不是Django的HttpResponse...)对象,同时允许你设置这个请求的处理方式。...fields = '__all__' @api_view(['GET', 'POST']) def card_list_view(request): '''基于函数式实现get和post请求'...这时候通过get和post访问此接口,就需要带上token,否则出现401 ? 如果没有token,状态码为401 ?
领取专属 10元无门槛券
手把手带您无忧上云