首页 > 解决方案 > 我想使用 url 参数作为可选过滤器 django rest 框架

问题描述

我有一个 django rest 框架应用程序,我想使用我的 url 参数作为查询集的可选过滤,它们在 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 和名称空间进行过滤和路径,如果所有三个值都传入了。我查看了所有文档,但我无法弄清楚。

标签: djangodjango-rest-frameworkdjango-views

解决方案


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

class PreferenceUserViewSet(...):
    ...

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

        ...

推荐阅读