使用FBV、CBV定制数据接口

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条数据

项目文件结构如下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值