自动生成路由,优化路由
from rest_framwork import routers
router = routers.SimpleRouter()
DefaultRouter与SimpleRouter功能类似,不过会自动添加一个根路由(作为获取当前数据的入口)
注册路由
router.register(r’projecs’,views.ProjectViewSet)
第一个参数,是路由的前缀
第二个参数,是视图集类
合并路由
方式一 和我们定义的一样
urlpatterns += router.urls
方式二
urlpatterns = [
path(‘’,include(router.urls)
]
使用视图集中的路由机制,只会为特定的action自动生成路由条路
特定的:
默认自定义的action,不会自动生成路由条目,需要手动添加路由映射 #####通过添加路径,变化,走action
path(‘projecs/names/’,views.ProjectViewSet.as_view({
‘get’:‘names’
}))
视图里的方法
class ProjectViewsSet(viewsets.GenericViewSet):
queryset = Projects.objects.all()
serializer_class = serializers.ProjectModelSerilizer
def names(self,request,*args,**kwargs):
pass
使用装饰器,可以自动生成条目
methods参数默认为get方法,可以在列表中指定多个请求方法
detail 指定是否需要接收模型主键值,如果无需接收主键值,那么需要设置为False,否则设为True,
得到的实例是 projecs/3/names/
url_path 指定生成的路由条目的路径名,默认为action方法名称
url_name 指定生成的路由条目的路由名称,默认为action方法名
@action()
class ProjectViewsSet(viewsets.GenericViewSet):
queryset = Projects.objects.all()
serializer_class = serializers.ProjectModelSerilizer
@action(methods=[‘get’],detail=False)#需要接受值detail=True
def names(self,request,*args,**kwargs):
pass
视图写法
class ProjectViews (ModelViewSet):
queryset = Projects.objects.all().order_by('id')
serializer_class = serializers.ProjectsModelSerializer
filter_fields = ['id', 'name', 'leader']
#search_fields = ['project_id', 'name', 'leader']
def list (self,request,*args,**kwargs):
log.info('正在获取所以项目信息,请求方式:{}'.format(self.action))
res = super().list(request,*args,**kwargs)
for i in res.data['results'] :
i['interface'] = Interfaces.objects.filter(project_id=i.get('id')).count()
i['testsuit'] = Testsuits.objects.filter(project_id=i.get('id')).count()
i['testcase'] = 0
i['configures'] = 0
testcase_count_queryset = Interfaces.objects.filter(project_id=i.get('id')).values('id').annotate(testcases=Count('testcases'))
#i['test'] = testcase_count_queryset
for testcase_count in testcase_count_queryset :
i['testcase'] +=testcase_count['testcases']
configures_count_queryset = Interfaces.objects.filter(project_id=i.get('id')).values('id').annotate(configures=Count('configures'))
for configures_count in configures_count_queryset :
i['configures'] +=configures_count['configures']
# if Interfaces.objects.filter(project=i.get('id')).count() !=0 :
# interface_ids = Interfaces.objects.filter(project=i.get('id'))
# for y in (0,len(interface_ids)-1) :
# i['testcase'] = i['testcase'] + Testcases.objects.filter(interface=(interface_ids[y].id)).count()
# i['configures'] = i['configures'] + Configures.objects.filter(interface=(interface_ids[y].id)).count()
return res
@action(methods=['get'],detail=False)
def names(self,request,*args,**kwargs):
return super().list(request,*args,**kwargs)
@action(methods=['get'], detail=True)
def interfaces(self, request, *args, **kwargs):
res = super().retrieve(request, *args, **kwargs)
res.data = res.data['interfaces']
return res
路由写法
from django.urls import path
from .views import ProjectViews
urlpatterns = [
path(r'projects/', ProjectViews.as_view({
'get':'list',
'post':'create'
})),
path(r'projects/<int:pk>/',ProjectViews.as_view(
{
'get':'retrieve',
'put':'update',
'delete':'destroy'
}
)),
path(r'projects/names/',ProjectViews.as_view(
{'get':'names'}
)),
path(r'projects/interfaces/<int:pk>',ProjectViews.as_view(
{'get':'interfaces'}
)),
]