drf 分页,获取fk,choise,m2m等字段数据(序列化)
1.什么是restful规范
是一套规则,用于程序之间进行数据交换的约定。
他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1个接口,根据method的不同做不同的操作,比如:get/post/delete/put/patch/delete.
初次之外,resetful规范还规定了:
- 数据传输通过json 扩展:前后端分离、app开发、程序之间(与编程语言无关)
2.什么是drf?
drf是一个基于django开发的组件,本质是一个django的app。
drf可以办我们快速开发出一个遵循restful规范的程序。
3.drf如何帮助我们快速开发的?drf提供了那些功能?
- 视图,APIView用处还不知道。
- 解析器:根据用户请求体格式不同进行数据解析,解析之后放在request.data中。
在进行解析时候,drf会读取http请求头 content-type.
如果content-type:x-www-urlencoded,那么drf会根据 & 符号分割的形式去处理请求体。
user=wang&age=19
如果content-type:application/json,那么drf会根据 json 形式去处理请求体。
{"user":"wang","age":19}
- 序列化:可以对QuerySet进行序列化,也可以对用户提交的数据进行校验。
- 渲染器:可以帮我们把json数据渲染到页面上进行友好的展示。(内部会根据请求设备不同做不同的展示)
4.展示特殊字段(fk,m2m,choices)
depth
serializers.CharField(source,无需加括号,在源码内部会去判断是否可执行,如果可执行自动加括号。【fk/choice】)
SerializerMethodField,定义钩子方法。【m2m】
4.1 序列化fk字段
from rest_framework import serializers
from hulaquan import models class PageArticleSerializer(serializers.ModelSerializer):
cate_name = serializers.CharField(source='categoryid.title',required=False)
class Meta:
model = models.HArticle
fields = ['id','title','summary','connect','count','a_ctime','cate_name','comments'] 注意:categoryid字段是HArticle表中的fk字段,categoryid.title是dian出来的title,跨表到关联表里面,取出title字段
4.2 序列化choices字段
from rest_framework import serializers
from api import models
import json
class ArticleSerializer(serializers.ModelSerializer):
status = serializers.CharField(source='get_status_display',required=False)
required=False:告诉后台在执行的时候该字段不是必须被填写的,是自己增加的字段,只是用作展示,但是在实际增加数据的时候不想要该字段。
get_status_display:使用get_字段名__display()获取对应字符串,但是在drf里面不需要添加(),因为drf源码会去判断当前字段是什么类型的,如果是方法,会自动加上扩号,如果是对象.xxx,则直接取出内容
4.3 序列化m2m字段
class ArticleSerializer(serializers.ModelSerializer):
tags = serializers.SerializerMethodField()
class Meta:
model = models.Article
fields = ['id','title','summary','content','category','name','status','tags'] def get_tags(self, obj):
tag_objs = obj.tag.all() # tag是Article里面的tag对象
# return [{"id": i.id} for i in tag_objs]
return [{"id": i.id, "title": i.title} for i in tag_objs]
5.drf分页
drf中给我们提供了常见的分页是两种,但是一共有三种分页
PageNumberPagination方式分页
配置settings:设置分页每页数据个数
rest_framework = {
"PAGE_SIZE":2
}
也可可以在本地重写一个类,来继承PageNumberPagination类
class page(PageNumberPagination):
page_size = 2
在使用的类中实力化该类。 视图列表里面
from rest_framework.page.ination import PageNumberPagination
from rest_freamework import serializers
class PageArticleSerializers(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = "__all__" class OageArticle(Apiview):
def get(self,requets,*args,**kwargs):
queryset = models.Article.objects.all()
# 方式一:仅取出数据
page_object = PageNumberPagination() #实力化分页器的类
# 调用分页对象.paginate_queryset()方法进行分页,得到的结果是分页完毕之后的一部分数据
result = page_object.paginate_queryset(queryset,request,self)
# 序列化分页之后的数据
ser =PageArticleSerializers(instance=result,many=True)
return Response(ser.data) # 方式二:数据 + 分页信息
"""
page_object = PageNumberPagination()
result = page_object.paginate_queryset(queryset, request, self)
ser = PageArticleSerializer(instance=result, many=True)
return page_object.get_paginated_response(ser.data)
"""
# 方式三:数据 + 自定义展示信息
page_object = PageNumberPagination()
result = page_object.paginate_queryset(queryset, request, self)
ser = PageArticleSerializer(instance=result, many=True)
return Response({'count':page_object.page.paginator.count,'result':ser.data}) 注意:分页只能在all时使用
LimitOffsetPagination方式分页
from rest_framework.pagination import PageNumberPagination
from rest_framework.pagination import LimitOffsetPagination
from rest_framework import serializers
class PageArticleSerializer(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = "__all__"
class HulaLimitOffsetPagination(LimitOffsetPagination):
max_limit = 2
class PageArticleView(APIView):
def get(self,request,*args,**kwargs):
queryset = models.Article.objects.all()
page_object = HulaLimitOffsetPagination()
result = page_object.paginate_queryset(queryset, request, self)
ser = PageArticleSerializer(instance=result, many=True)
return Response(ser.data)
指定分页类型
REST_FRAMEWORK = {
"PAGE_SIZE":2,
"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination"
}
报错总结
1.UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'api.models.Article'> QuerySet.paginator = self.django_paginator_class(queryset, page_size)
使用分页的时候会有warring 是因为没有指定分页器到底使用哪个分页器,因为里面有两个分页器,需要指定一个分页器是没有对取出来的数据进行排序
2.not null constraint failed: api_article.category_id
错误是因为已经通过校验了,但是查看ser.validata_data(是验证成功之后的数据。)只是拿到了两个字段
本身我们已经post过去数据了,但是Serializer没有我们获取到全部的值。
所以我们可以在定义一个Serializer类,专门去做增加,修改等操作。
特别注意(非常重要)
基于Serializer本身的fiedls的写法
fileds= “__all__”或者filedls= ['id','title','....']
以后我们可以:
为数据列表写一个Serializer
为单条数据的获取写一个Serializer
为评论等写一个Serializer
这样数据可以展示几个相关要点字段,没必要全部展示,数据添加的时候,可以使用另一个serialisers来进行序列化 完全不必要使用一个serializers来对所有方法的返回数据进行序列化,一般都使用多个
drf 分页,获取fk,choise,m2m等字段数据(序列化)的更多相关文章
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- drf分页功能
什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...
- SQL Server 怎么在分页获取数据的同时获取到总记录数
SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SE ...
- 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期
腾讯云图片鉴黄集成到C# 官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...
- Django DRF 分页
Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...
- resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found.
resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found. 代码: String sql="SELECT d.co ...
- 请求Url返回数据较大,使结果分页获取
首先创建了一个单元测试,如下项目视图: 分页结果映射类PageResult的编写: using System; using System.Collections.Generic; using Syst ...
- redis分页获取数据
php代码: 采用哈希类型存储数据,有序集合存储分页数据,进行倒序与正序的排序. $getGoodsInfo = M('goods_test')->select(); for($i=0;$i&l ...
- 获取器操作都是针对数据而不是数据集的,要通过append()方法添加数据表不存在的字段
获取器操作都是针对数据而不是数据集的,要通过append()方法添加数据表不存在的字段 public function getMembership(){ //加入会员s_id = 1 $busines ...
随机推荐
- IDEA 中常用插件
怎么找到安装插件位置 Mybatis plugin 可以在mapper接口中和mapper的xml文件中来回跳转,就想接口跳到实现类那样简单. Lombok plugin 开发神器,可以简化你的实体类 ...
- MySQL-第五篇视图
1.视图看上去像是表,但它又不是,它并不能存储数据.视图只是一个或者多个表的逻辑显示.使用视图的好处: 1>可以限制对数据的访问 2>可以使复杂的查询变得简单 3>提供了数据的独立性 ...
- 问题 1436: 地宫取宝 (dp)
题目传送门 时间限制: 1Sec 内存限制: 128MB 提交: 423 解决: 94 题目描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标 ...
- Windows 程序设计--(六)键盘
6.2 击键消息 当按下一个键时,Windows把WM_KEYDOWN或者WM_SYSKEYDOWN消息放入有输入焦点的窗口的消息队列:当您释放一个键时,Windows把WM_KEYUP或者WM_SY ...
- redis 命令大全
全局命令: 1.查看所有键:keys * 2.键总数:dbsize 3.检查键是否存在:exists key 4.删除键:del key [key ...] 5.键过期:expire key seco ...
- 一网打尽 @ExceptionHandler、HandlerExceptionResolver、@controlleradvice 三兄弟!
把 @ExceptionHandler.HandlerExceptionResolver.@controlleradvice 三兄弟放在一起来写更有比较性.这三个东西都是用来处理异常的,但是它们使用的 ...
- squid代理与缓存(上)
squid代理与缓存(上) 1. Squid介绍 1.1 缓存服务器介绍 缓存服务器(英文意思cache server),即用来存储(介质为内存及硬盘)用户访问的网页,图片,文件等等信息的专用服务器. ...
- HTML基础 用div布局实现一个简单网页
div布局如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- html5 实例渐变
代码实例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 特朗普或出席!富士康耗资100亿美元建LCD液晶面板厂
富士康建液晶工厂,富士康科技集团发言人证实,富士康科技集团将于今年6月28日耗资100亿美元的LCD面板厂举行动工仪式. 富士康周四表示,他已经了解到,仪式将于今年6月28日举行,包括美国总统特朗普总 ...