【问题标题】:Django rest url routers on class based views基于类的视图上的 Django rest url 路由器
【发布时间】:2020-01-21 06:28:49
【问题描述】:

我想在具有多个参数的路线上获取我的子模块的详细信息。 我现在现有的路线是:

我想做http://localhost:8000/api/module/1/submodules/1,它将获取子模块的详细信息。我应该如何使用基于类的视图来做到这一点?

以下是我现有的代码:

Views.py

class CourseModuleViewSet(viewsets.ModelViewSet):
    queryset = CourseModule.objects.all()
    serializer_class = CourseModuleSerializer

    def retrieve(self, request, pk=None):
        coursemodule = CourseModule.objects.get(id=pk)
        submodule = SubModule.objects.filter(submodule_module_id=pk)

        serializer = SubModuleSerializer(submodule, many=True)
        response = {'message': 'Sucess!',
            'result': serializer.data}
        return Response(serializer.data, status=status.HTTP_200_OK)

Serializers.py

class CourseModuleSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseModule
        fields = ['class_id', 'coursemodule_title', 'coursemodule_date_created',
            'coursemodule_last_modified', 'coursemodule_created_by']

class SubModuleSerializer(serializers.ModelSerializer):
    submodule_module_id = CourseModuleSerializer(many=False)
    class Meta:
        model = SubModule
        fields = ['submodule_module_id','submodule_title', 'submodule_date_created', 'submodule_last_modified',
            'submodule_created_by']

urls.py

router = routers.DefaultRouter()
router.register('module', CourseModuleViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    你可以使用drf-nested-routers.

    您需要在 urls.py 中包含一个额外的 NestedRouter,如下所示:

    router = routers.DefaultRouter()
    router.register(r'module', CourseModuleViewSet)
    
    sub_modules_router = routers.NestedSimpleRouter(router, r'module', lookup='module')
    sub_modules_router.register(r'submodules', SubModuleViewSet, base_name='module-submodules')
    
    
    urlpatterns = patterns('',
        url(r'^', include(router.urls)),
        url(r'^', include(sub_modules_router.urls)),
    )
    

    然后你可以像这样创建一个 SubModuleViewSet:

    class SubModuleViewSet(viewsets.ModelViewSet):
        def get_queryset(self):
            return SubModule(submodule_module_id =self.kwargs['module_pk'])
    
        serializer_class = SubModuleSerializer 
    

    【讨论】:

    • 完美!这对我帮助很大!
    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2023-01-13
    • 2018-11-19
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多