Как предотвратить добавление первичного ключа к URL-адресу остальной структуры django - PullRequest
0 голосов
/ 03 июля 2019

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

Вот URL:

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

Вот наборы представлений:

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_namespace = '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_namespace = '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

это список всех URL-адресов, доступных в бэкенде остальной структуры django:

api/v2/ ^preferences/(?P<namespace>.+)/(?P<path>.+)/$ [name='Preference-path-list']
api/v2/ ^preferences/(?P<namespace>.+)/(?P<path>.+)/(?P<pk>[^/.]+)/$ [name='Preference-path-detail']
api/v2/ ^preferences/(?P<namespace>.+)/$ [name='Preference-namespace-list']
api/v2/ ^preferences/(?P<namespace>.+)/(?P<pk>[^/.]+)/$ [name='Preference-namespace-detail']
api/v2/ ^preferences/$ [name='Preference-list']
api/v2/ ^preferences/(?P<pk>[^/.]+)/$ [name='Preference-detail']

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

Кроме того, прямо сейчас, если я просто сделаю preferences/, я получу отфильтрованные результаты.если я сделаю preferences/namespace1, я не получу никаких результатов, даже если есть результаты, в которых для пространства имен установлено значение namespace1.То же самое произойдет, если я сделаю preferences/namespace1/path1

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

...