Я хочу использовать параметры URL как необязательные фильтры django rest framework - PullRequest
0 голосов
/ 08 июля 2019

У меня есть приложение django rest Framework, и я хочу использовать мои параметры url в качестве дополнительной фильтрации для набора запросов, если они указаны в url.

Прямо сейчас я пытаюсь получить параметры из URL-адреса, и они не захватываются, а затем не применяют параметры в качестве фильтра.

может кто-нибудь помочь мне с этим.

urls:

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')

viewset:

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, если нет переданного пространства имен или пути. Я хочу отфильтровать на основе user_id и пространства имен, если передано пространство имен, а путь не указан. Я хочу отфильтровать на основе user_id, пространства имен и пути, если все три значения переданы вЯ посмотрел все документы, но не смог понять.

1 Ответ

0 голосов
/ 08 июля 2019

Вместо self.request.query_params, вы должны использовать self.kwargs в вашем методе get_queryset, поскольку namespace и path не являются параметрами запроса , а аргументами изURL.

class PreferenceUserViewSet(...):
    ...

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

        ...
...