基于类的视图上的Django rest url路由器

时间:2019-09-20 08:01:34

标签: django django-rest-framework

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

我想做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)),
]

1 个答案:

答案 0 :(得分: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 
相关问题