我有一个django rest框架应用程序,我想使用我的url参数作为对queryset的可选过滤,它在url中给出。
现在,我正在尝试从url中获取参数,而它们没有在获取,因此也没有将参数用作过滤器。
有人可以帮我这个忙吗
网址:
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')
视图集:
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进行过滤。如果传入的namepsace且未传入路径,则我希望基于user_id和名称空间进行过滤。我想基于user_id以及名称空间和路径(如果所有三个值都传入了)。我查看了所有文档,但无法弄清楚。
答案 0 :(得分:0)
您应该在self.request.query_params
方法中使用self.kwargs
,而不是get_queryset
,因为namespace
和path
不是查询参数,但网址的参数。
class PreferenceUserViewSet(...):
...
def get_queryset(self):
namespace = self.kwargs.get('namespace', None)
path = self.kwargs.get('path', None)
...