我想使用url参数作为django rest框架的可选过滤器

时间:2019-07-08 16:59:21

标签: django django-rest-framework django-views

我有一个django rest框架应用程序,我想使用我的url参数作为对queryset的可选过滤,它在url中给出。

现在,我正在尝试从url中获取参数,而它们没有在获取,因此也没有将参数用作过滤器。

有人可以帮我这个忙吗

网址:

router.register(r'preferences', PreferenceUserViewSet, basename='Preference')
router.register(r'preferences/(?P<namespace>\w+)', PreferenceUserViewSet, basename='Preference-namespace')
router.register(r'preferences/(?P<namespace>\w+)/(?P<path>\w+)', PreferenceUserViewSet, basename='Preference-path')

视图集:

class PreferenceUserViewSet(viewsets.ModelViewSet):

    model = Preference
    serializer_class = PreferenceSerializer

    def get_permissions(self):
        if self.action == 'create' or self.action == 'destroy':
            permission_classes = [IsAuthenticated]
        else: 
            permission_classes = [IsAdminUser]
        return [permission() for permission in permission_classes]
    @permission_classes((IsAuthenticated))
    def get_queryset(self):
        namespace = self.request.query_params.get('namespace', None)
        path = self.request.query_params.get('path', None)
        print(namespace)
        print(path)
        queryset = Preference.objects.filter(user_id=1)
        if path is not None:
            queryset = Preference.objects.filter(user_id=1, namespace=namespace)
        if namespace is not None:
            queryset = Preference.objects.filter(user_id=1, namespace=namespace, path=path)
        return queryset


因此,如果没有传入的名称空间或路径,我想仅基于user_id进行过滤。如果传入的namepsace且未传入路径,则我希望基于user_id和名称空间进行过滤。我想基于user_id以及名称空间和路径(如果所有三个值都传入了)。我查看了所有文档,但无法弄清楚。

1 个答案:

答案 0 :(得分:0)

您应该在self.request.query_params方法中使用self.kwargs,而不是get_queryset,因为namespacepath不是查询参数,但网址的参数

class PreferenceUserViewSet(...):
    ...

    def get_queryset(self):
        namespace = self.kwargs.get('namespace', None)
        path = self.kwargs.get('path', None)

        ...