FBV - 基于函数的视图 - 最灵活高度定制
CBV - 基于类的视图 - 代码极度简单
之前写的api都是基于FBV的操作(高度灵活,但是比较繁琐)
接下来用(drm)CBV写一套api 用之前的车辆违章系统来写
在serach.serializers.py中添加代码
class CarDetailSerializer(serializers.ModelSerializer):
"""车详情序列化器"""
class Meta:
model = Car #需要导入Car模型
fields = '__all__'
在views.py中添加代码
from rest_framework.viewsets import ModelViewSet
from serach.serializers import RecordSerializer, CarDetailSerializer
from serach.models import Record,Car
class CarViewSet(ModelViewSet):
queryset = Car.objects.all()
serializer_class = CarDetailSerializer
配置路由,修改urls.py代码
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('cars',CarViewSet) #注册 增删改查的url 也可以改为/api/cars/
urlpatterns += router.urls #合并两个列表
#可以请求/cars页面,有增删改查的接口 /cars/1 查看1号车,可以删改
正规化应该是把接口全部放在api/…接口下
#新建一个api应用
python manage.py startapp api
#从carsys/urls.py中复制一份urls.py放置api/路径下(注意现在有两个urls.py,一个是项目的urls.py,一个是api的urls.py)
#从serarch/views.py中移植数据接口到api/views.py中
--------------------------------------------------------------------------------
#在api/views.py中,代码如下(移植过来后,在search/views.py中将删除如下的代码)
import re
from django.db.models import Q
from django.views.decorators.cache import cache_page
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from serach.models import Car, Record
from serach.serializers import CarDetailSerializer, RecordSerializer
#如果要设计只读的接口,继承 ReadOnlyModelViewSet 就可以
class CarViewSet(ModelViewSet): #继承ModelViewSet一般是增删改查的全部操作
queryset = Car.objects.all() #CBV车的详情接口,drf封装
serializer_class = CarDetailSerializer
@api_view(('GET',)) #FBV 违章记录,高度灵活
@cache_page(timeout=60,cache='default') #设置缓存,生命周期60秒,使用default数据库配置
def records_api(request):
queryset = Record.objects.filter(is_deleted=False) \
.defer('is_deleted', 'updated_time', 'deleted_time') \
.select_related('car').order_by('-no')
carinfo = request.GET.get('carinfo','')
if carinfo:
info = re.sub(r'\s','',carinfo)
queryset = queryset.filter(
Q(car__carno__istartswith=carinfo) | Q(car__owner__icontains=carinfo)
)
resi = RecordSerializer(queryset,many=True)
return Response({'records':resi.data})
---------------------------------------------------------------------------------
#在api/urls.py代码如下
from django.urls import path
from rest_framework.routers import DefaultRouter
from api.views import records_api, CarViewSet
urlpatterns = [
path('records/',records_api), #违章记录的接口
]
router = DefaultRouter()
router.register('cars',CarViewSet) #车的路由配置
urlpatterns += router.urls
------------------------------------------------------------------------------------
#在carsys/urls.py中,写访问路由(项目的路由)
from django.conf import settings
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from serach.views import index, handle_record, delete_record, export_excel
urlpatterns = [
path('admin/', admin.site.urls),
# path('search/',search),
path('',index),
path('handle/',handle_record),
path('delete/',delete_record),
path('export/',export_excel),
path('api/',include('api.urls')), #给api路径下的urls前面都加上api/...
]
if settings.DEBUG:
import debug_toolbar
urlpatterns.insert(0, path('__debug__/', include(debug_toolbar.urls)))
#此时访问127.0.0.1:8000/api/cars 可以拿到drm封装好车的详情,可以增删改查
#此时访问127.0.0.1:8000/api/records 可以拿到FBV写好的违章记录json数据
#给CBV的数据分页,drm自带分页功能,修改settings.py文件即可
REST_FRAMEWORK = {
'PAGE_SIZE': 3, #页面存放的数据
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
}
#再次访问api/cars 每页将显示3条数据
项目文件结构如下