У меня есть проект 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-адресу, который вызывает проблему, или нет ...