<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>18 on 中二青年</title>
    <link>https://zhong-er.com/tags/18/</link>
    <description>Recent content in 18 on 中二青年</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 25 Oct 2019 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://zhong-er.com/tags/18/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【DRF】 django rest framework总结</title>
      <link>https://zhong-er.com/posts/drf-django-rest-framework%E6%80%BB%E7%BB%93/</link>
      <pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf-django-rest-framework%E6%80%BB%E7%BB%93/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;1接口&#34;&gt;1.接口**&lt;/h1&gt;
&lt;p&gt;**&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
1、什么是接口：url+请求参数+响应数据 | 接口文档

2、接口规范：
	url：https，api，资源(名词复数)，v1，get|post表示操作资源的方式，?过滤条件
	响应数据：status，msg，results|data，url资源数据
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;2drf入门&#34;&gt;2.DRF入门&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;&amp;quot;&amp;quot;
1、封装风格

2、请求生命周期：走APIView的as_view =&amp;gt; View的as_view调用APIView的dispatch =&amp;gt; 分发给视图类的请求函数 =&amp;gt; 响应

3、请求模块：二次封装request

4、解析模块：局部全局配置，form-data、urlencoding、json

5、渲染模块：局部全局配置，html、json

6、响应模块：Response(data, http_status, header)
data={&#39;detail&#39;: serializer_obj.errors} =&amp;gt; http_status=4..|5..
# 4,5开头字段状态码，前台axios请求响应会解析到catch分支
axios({}).then().catch()

7、二次封装Response：
	i) 继承Response
	ii) 自定义参数格式化成data，传给 super().__init__(data=data)
	iii) 网络状态码、响应头等信息带给super().__init__()
	
8、异常模块：在请求生命周期中，分发请求任务执行时，被一个超大的try except包裹，一旦出现任何异常，都会交给exception_handler函数处理
	自定义原因：系统只处理了部分，所以手动还需要处理；后期异常信息需要记录到日志文件
	工作流程：先交给drf处理异常，如果有响应结果，代表drf已处理，如果是None，自己处理
&amp;quot;&amp;quot;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;3序列化组件&#34;&gt;3.序列化组件**&lt;/h1&gt;
&lt;p&gt;**&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1）可以将model对象序列化成可以返回给前台的json数据
# 2）可以校验前台传来的数据，完成model的增与改
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模型层&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class User(models.Model):
    name = models.CharField(max_length=16)
    
    # 自定义插拔序列化字段 - 完成连表深度查询
    @property
    def my_name(self):
        return self.name
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;序列化层&lt;/p&gt;</description>
    </item>
    <item>
      <title>【DRF】偏移分页组件/游标分页组件/自定义过滤器/过滤器插件</title>
      <link>https://zhong-er.com/posts/drf%E5%81%8F%E7%A7%BB%E5%88%86%E9%A1%B5%E7%BB%84%E4%BB%B6%E6%B8%B8%E6%A0%87%E5%88%86%E9%A1%B5%E7%BB%84%E4%BB%B6%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%87%E6%BB%A4%E5%99%A8%E8%BF%87%E6%BB%A4%E5%99%A8%E6%8F%92%E4%BB%B6/</link>
      <pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/drf%E5%81%8F%E7%A7%BB%E5%88%86%E9%A1%B5%E7%BB%84%E4%BB%B6%E6%B8%B8%E6%A0%87%E5%88%86%E9%A1%B5%E7%BB%84%E4%BB%B6%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BF%87%E6%BB%A4%E5%99%A8%E8%BF%87%E6%BB%A4%E5%99%A8%E6%8F%92%E4%BB%B6/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;img alt=&#34;drf.jpg&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201910177473_80_1.jpg&#34;&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;1drf偏移分页组件&#34;&gt;1.drf偏移分页组件&lt;/h1&gt;
&lt;p&gt;pahenations.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from rest_framework.pagination import LimitOffsetPagination
class MyLimitOffsetPagination(LimitOffsetPagination):
    # ?offset=从头偏移的条数&amp;amp;limit=要显示的条数
    limit_query_param = &#39;limit&#39;
    offset_query_param = &#39;offset&#39;
    # ?不传offset和limit默认显示前3条，只设置offset就是从偏移位往后再显示3条
    default_limit = 3
    # ?limit可以自定义一页显示的最大条数
    max_limit = 5

    # 只使用limit结合ordering可以实现排行前几或后几
    # ?ordering=-price&amp;amp;limit=2  =&amp;gt; 价格前2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;views.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from rest_framework.generics import ListAPIView

class CarListAPIView(ListAPIView):
    # 如果queryset没有过滤条件，就必须 .all()，不然分页会出问题
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer
    
    # 分页组件 - 给视图类配置分页类即可 - 分页类需要自定义，继承drf提供的分页类即可
    pagination_class = pagenations.MyLimitOffsetPagination
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;2drf游标分页组件&#34;&gt;2.drf游标分页组件&lt;/h1&gt;
&lt;p&gt;pahenations.py&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 注：必须基于排序规则下进行分页
# 1）如果接口配置了OrderingFilter过滤器，那么url中必须传ordering
# 1）如果接口没有配置OrderingFilter过滤器，一定要在分页类中声明ordering按某个字段进行默认排序
from rest_framework.pagination import CursorPagination
class MyCursorPagination(CursorPagination):
    cursor_query_param = &#39;cursor&#39;
    page_size = 3
    page_size_query_param = &#39;page_size&#39;
    max_page_size = 5
    ordering = &#39;-pk&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;views.py&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
