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. 《JAVA设计模式》之策略模式(Strategy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述策略(Strategy)模式的: 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它 ...

  2. 【五一qbxt】day7-2 选择客栈

    停更20天祭qwq(因为去准备推荐生考试了一直在自习qwq) [noip2011选择客栈] 这道题的前置知识是DP,可以参考=>[五一qbxt]day3 动态规划 鬼知道我写的是什么emm 这道 ...

  3. CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC

    /**  * CVE-2014-4014 Linux Kernel Local Privilege Escalation PoC  *  * Vitaly Nikolenko  * http://ha ...

  4. Windows系统时间会偶尔自动回拨吗?

     为什么80%的码农都做不了架构师?->>>    Spring boot 项目 通过日志记录插入sql操作用时 long start2 = System.currentTimeMi ...

  5. SLA服务可用性4个9是什么意思?怎么达到?

    SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...

  6. JVM(7)之 从GC日志分析堆内存

    开发十年,就只剩下这套架构体系了! >>>   在前面的文章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和 ...

  7. JVM(2)之 JAVA堆

    开发十年,就只剩下这套架构体系了! >>>   之前我们说到了栈,它在内存中是连续的空间:保存一个个的栈帧,对应一次次方法的调用:还讲到了他是保存对象的引用,那么对象存在哪里呢?我们 ...

  8. k3 cloud中列表字段汇总类型中设置了汇总以后没有显示出汇总值

    处理方法,需要bos中的分组列信息中设置求和: 选择对应字段将其从左侧添加到右侧 方法二: 直接针对[价税合计]字段的列表汇总类型进行设置,步骤如下图所示

  9. 前端对base64编码的理解,原生js实现字符base64编码

    目录 常见对base64的认知(不完全正确) 多问一个为什么,base64到底是个啥? 按照我们的思路实现一下 到这里基本就实现了,结果跟原生的方法打印的是一样的 下一次 @( 对于前端工程师来说ba ...

  10. 手写Mybatis,还需要后面调整下

    参考博客 https://blog.csdn.net/Kurozaki_Kun/article/details/81482212 个人理解 读取Mybatis配置文件 数据库连接信息 读取Mapper ...