DRF框架、实现单查群查接口

一、DRF(Django REST framework )框架的安装

Django REST framework 框架 (建立在Django框架基础之上,可以理解为是django的一个插件)  :

是一个用于构建Web API 的强大而又灵活的工具。通常简称为DRF框架 或 REST framework。

1、特点:

2、作用:(写接口:API)

     drf 用来写接口的(更快、更规范),不用django 写原生的接口,因为drf 是基于resful规范写的接口

 要去settings文件中的中间件注掉,就不报错了。

 

 

 

结果:

 

 

 

 结果:{'z':'3'} 没用被解析到PSOT中

 结论:django写原生的接口 不支持json数据格式

  3、安装
     >: pip install djangorestframework

4、在settings中注册(为什么要注册,后期会讲)   看下下个博客中的 Django配置

     INSTALLED_APPS = [
     # ...
     'rest_framework',
     ]

5、在settings中自定义drf配置:

     REST_FRAMEWORK = {}

      注:drf配置查找顺序,自定义settings的REST_FRAMEWORK配置字典 => drf 默认settings的DEFAULTS

6、drf的封装特点:特点功能在特点模块下

     from rest_framework.views import APIView
     from rest_framework.response import Response
     from rest_framework.request import Request

二、图书资源准备

1)在models.py创建Model类
       from django.db import models
       class Book(models.Model):
       name = models.CharField(max_length=64, verbose_name='书名')
       price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='价格')

       # 配置类
       class Meta:
             verbose_name_plural = '图书'

             def __str__(self):
                    return self.name

 

2)在admin.py中注册Model类,方便在后台(admin)可视化管理数据
       from django.contrib import admin
       from . import models
       admin.site.register(models.Book)             # admin要控制的model都需要注册一下

3)数据库迁移操作
>: python manage.py makemigrations
>: python manage.py migrate
>: python manage.py createsuperuser
admin | Admin123

4)浏览器登录admin录入数据:http://localhost:8000/admin

三、基于restful接口规范的接口设计

urls.py文件中:

urlpatterns = [
        # 资源books接口的设计
       url(r'^books/$', views.BookAPIView.as_view()), # 群查、单增
       url(r'^books/(?P<pk>\d+)/$', views.BookAPIView.as_view()), # 单查、单删、单(整体|局部)改
]

四、实现单查群查接口

from rest_framework.views import APIView
from rest_framework.response import Response
from . import models
class BookAPIView(APIView):
    def _multiple_get(self):
        # 不能返回,数据是QuerySet[Obj, Obj],也不能强制转换list
        # return list(models.Book.objects.all())

        # QuerySet[dict, dict]
        # print(models.Book.objects.values('name', 'price'))
        # QuerySet[tuple, tuple]
        # print(models.Book.objects.values_list('name', 'price'))

        return Response(list(models.Book.objects.values('name', 'price')))

    def _single_get(self, pk):
        # return Response(models.Book.objects.filter(pk=pk).values('name', 'price').first())

        # 开发阶段建议能用try的地方,不要使用if判断
        try:
            return Response(models.Book.objects.values('name', 'price').get(pk=pk))
        except:
            return Response('资源不存在')

    # 单查、群查
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:
            # 单查逻辑
            return self._single_get(pk)
        else:
            # 群查逻辑
            return self._multiple_get()

 

 

 

 

 

 

 五、APIView视图基类分析

 

 

 

 

 

 

posted @ 2020-02-18 15:39  薛定谔的猫66  阅读(805)  评论(0)    收藏  举报