[Django]路由实现

本文介绍了Django中如何使用SimpleRouter和DefaultRouter自动生成路由,并展示了注册路由和合并路由的不同方法。详细讨论了视图集中的action装饰器,如何为特定action手动添加路由映射,以及detail参数、methods参数、url_path和url_name的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动生成路由,优化路由
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'}
    )),
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值