03 DRF框架安装和实现单查群查接口

DRF框架的安装

1)安装
>: pip install djangorestframework
 
2)在settings中注册(为什么要注册,后面再说)
INSTALLED_APPS = [
    # ...
    'rest_framework',
]
 
3)在settings中自定义drf配置
注:drf配置查找顺序,自定义settings的REST_FRAMEWORK配置字典 => drf默认settings的DEFAULTS
REST_FRAMEWORK = {}
 
4)drf的封装特点:特定功能在特定模块下,比原生Django封装更规范
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='书名')  # verbose_name设置后在后台管理中字段名字会显示“书名”
    price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name='价格')
 
    # 配置类
    class Meta:
        verbose_name_plural = '图书'  # verbose_name设置后表名为“图书s”, verbose_name_plural设置后表名在后台管理中显示“图书”
 
    def __str__(self):  # 设置后在后台管理中,会打印表中记录的数据,例如name='Bob',就会将Bob显示出来
        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接口规范的接口设计

标准的写法,可以满足十大接口设计

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()
原文地址:https://www.cnblogs.com/cnhyk/p/12354580.html