фильтр запросов с пространством имен и путем от параметров URL - PullRequest
0 голосов
/ 08 июля 2019

У меня есть приложение django rest framework.Я хочу передать два параметра через URL, и если они передаются, я хочу использовать каждый из параметров в качестве фильтра в наборе запросов.Так в основном.если не передан параметр, то захватить все данные для пользователя.если пространство имен передается, я хочу фильтровать по пользователю и пространству имен.если путь введен, я хочу фильтровать по пользователю, пространству имен и пути.Теперь он этого не делает.

У меня настроено 3 разных URL, которые идут к 3 различным наборам, потому что, когда я пытаюсь сделать его одним URL, он выдает ошибку и не работает вообще.

Я также хочу, чтобы пространство имен и путь были дополнительно включены в URL, чтобы URL работал без пространства имен и назначенного ему пути.Когда я пробовал один URL, это потребовало бы обоих параметров для работы ....

URL:

router.register(r'preferences', PreferenceUserViewSet, basename='Preference')
router.register(r'preferences/(?P<namespace>.+)', PreferenceNamespaceViewSet, basename='Preference-namespace')
router.register(r'preferences/(?P<namespace>.+)/(?P<path>.+)', PreferencePathViewSet, 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):
        queryset = Preference.objects.filter(user_id=1)
        return queryset

class PreferenceNamespaceViewSet(viewsets.ModelViewSet):

    model = Preference
    serializer_class = PreferenceSerializer
    lookup_namepsace = 'namespace'

    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')
        queryset = Preference.objects.filter(user_id=1, namespace=namespace)
        return queryset

class PreferencePathViewSet(viewsets.ModelViewSet):

    model = Preference
    serializer_class = PreferenceSerializer
    lookup_namepsace = 'namespace'
    lookup_path = 'path'

    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')
        path = self.request.query_params.get('path')
        queryset = Preference.objects.filter(user_id=1, namespace=namespace, path=path)
        return queryset

Я пытаюсь понятьпростое решение этого процесса.

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

...