我有一个django rest框架应用程序。我想通过url传递两个参数,如果要传递它们,那么我想使用每个参数作为queryset中的过滤器。所以基本上。如果未传递参数,则为用户获取所有数据。如果传入名称空间,我想按用户和名称空间进行过滤。如果输入路径,我想按用户,名称空间和路径进行过滤。现在,它没有这样做。
我将它设置为3个不同的URL,这些URL转到3个不同的视图集,因为当我尝试将其设为单个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')
视图集:
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
我正在尝试找出解决此问题的简单方法。
应该发生的情况是,如果没有传递名称空间和路径来返回所有首选项。如果包含名称空间,则按名称空间过滤首选项,并与路径相同。