Создание нового набора просмотра с несколькими фильтрами для метода get набора просмотра - PullRequest
0 голосов
/ 03 июля 2019

Привет, у меня есть viewset, который я создаю. Я хочу переопределить функцию get functino и получить все записи с фильтрованным параметром, который передается в представление get. Я также хочу иметь возможность выполнять остальную часть грубой функциональности - GET POST PUT DELETE - и использовать параметр, передаваемый через url, в качестве параметра для POST и UPDATE.

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

Вот код:

viewset

class PreferenceUserViewSet(viewsets.ModelViewSet):

    queryset = Preference.objects.all().filter(user_id=1)
    serializer_class = PreferenceSerializer

class PreferenceNamespaceViewSet(viewsets.ModelViewSet):
    queryset = Preference.objects.all().filter(user_id=1)
    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 list(self, request, namespace=None):
        # switch user_id value with logged in users id
        queryset = Preference.objects.all().filter(user_id=1, namespace=namespace)
        serializer = PreferenceSerializer(queryset, many=True)
        return Response(serializer.data)

URL:

    path('preferences/<str:namespace>/', PreferenceNamespaceViewSet.as_view({
        'get':'list'
    })),
    path('users/<int:pk>/stacks/', person_stack, name='user-stacks'),

Я хочу использовать namepsace в качестве вторичного фильтра для всех данных, возвращаемых в GET. Я также хочу использовать его как часть данных, которые я могу ввести при создании нового предпочтения.

** Я также хочу сделать то же самое с третьим потенциальным параметром, например ... **

потенциальные третьи параметры:

urlpatterns = [
    path('preferences/<str:namespace>/<str:path>', PreferencePathViewSet.as_view({
        'get':'list'
    })),
    path('preferences/<str:namespace>/', PreferenceNamespaceViewSet.as_view({
        'get':'list'
    })),
    path('users/<int:pk>/stacks/', person_stack, name='user-stacks'),
]

1 Ответ

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

Я думаю, вам не следует добавлять пространство имен в качестве параметра url, вместо этого вы можете использовать URL querystring для получения информации о пространстве имен (а также других параметров). например:

# URL
path('preferences/', PreferencePathViewSet.as_view({
        'get':'list'
    })
),

# view
class PreferenceNamespaceViewSet(viewsets.ModelViewSet):
    queryset = Preference.objects.all().filter(user_id=1)
    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 list(self, request):
        queryset = Preference.objects.all()
        <b>namespace = request.GET.get('namespace', None)
        if namespace:
             queryset = queryset.filter(user_id=1, namespace=namespace)</b>
        serializer = PreferenceSerializer(queryset, many=True)
        return Response(serializer.data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...