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等字段数据(序列化)的更多相关文章

  1. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  2. drf分页功能

    什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...

  3. SQL Server 怎么在分页获取数据的同时获取到总记录数

    SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SE ...

  4. 腾讯云图片鉴黄集成到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 ...

  5. Django DRF 分页

    Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...

  6. resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found.

    resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found. 代码: String sql="SELECT d.co ...

  7. 请求Url返回数据较大,使结果分页获取

    首先创建了一个单元测试,如下项目视图: 分页结果映射类PageResult的编写: using System; using System.Collections.Generic; using Syst ...

  8. redis分页获取数据

    php代码: 采用哈希类型存储数据,有序集合存储分页数据,进行倒序与正序的排序. $getGoodsInfo = M('goods_test')->select(); for($i=0;$i&l ...

  9. 获取器操作都是针对数据而不是数据集的,要通过append()方法添加数据表不存在的字段

    获取器操作都是针对数据而不是数据集的,要通过append()方法添加数据表不存在的字段 public function getMembership(){ //加入会员s_id = 1 $busines ...

随机推荐

  1. IDEA 中常用插件

    怎么找到安装插件位置 Mybatis plugin 可以在mapper接口中和mapper的xml文件中来回跳转,就想接口跳到实现类那样简单. Lombok plugin 开发神器,可以简化你的实体类 ...

  2. MySQL-第五篇视图

    1.视图看上去像是表,但它又不是,它并不能存储数据.视图只是一个或者多个表的逻辑显示.使用视图的好处: 1>可以限制对数据的访问 2>可以使复杂的查询变得简单 3>提供了数据的独立性 ...

  3. 问题 1436: 地宫取宝 (dp)

    题目传送门 时间限制: 1Sec 内存限制: 128MB 提交: 423 解决: 94 题目描述 X  国王有一个地宫宝库.是  n  x  m  个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标 ...

  4. Windows 程序设计--(六)键盘

    6.2 击键消息 当按下一个键时,Windows把WM_KEYDOWN或者WM_SYSKEYDOWN消息放入有输入焦点的窗口的消息队列:当您释放一个键时,Windows把WM_KEYUP或者WM_SY ...

  5. redis 命令大全

    全局命令: 1.查看所有键:keys * 2.键总数:dbsize 3.检查键是否存在:exists key 4.删除键:del key [key ...] 5.键过期:expire key seco ...

  6. 一网打尽 @ExceptionHandler、HandlerExceptionResolver、@controlleradvice 三兄弟!

    把 @ExceptionHandler.HandlerExceptionResolver.@controlleradvice 三兄弟放在一起来写更有比较性.这三个东西都是用来处理异常的,但是它们使用的 ...

  7. squid代理与缓存(上)

    squid代理与缓存(上) 1. Squid介绍 1.1 缓存服务器介绍 缓存服务器(英文意思cache server),即用来存储(介质为内存及硬盘)用户访问的网页,图片,文件等等信息的专用服务器. ...

  8. HTML基础 用div布局实现一个简单网页

    div布局如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  9. html5 实例渐变

    代码实例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  10. 特朗普或出席!富士康耗资100亿美元建LCD液晶面板厂

    富士康建液晶工厂,富士康科技集团发言人证实,富士康科技集团将于今年6月28日耗资100亿美元的LCD面板厂举行动工仪式. 富士康周四表示,他已经了解到,仪式将于今年6月28日举行,包括美国总统特朗普总 ...