具有名称空间和url参数路径的查询过滤器

时间:2019-07-07 23:41:29

标签: python django django-rest-framework django-views

我有一个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

我正在尝试找出解决此问题的简单方法。

应该发生的情况是,如果没有传递名称空间和路径来返回所有首选项。如果包含名称空间,则按名称空间过滤首选项,并与路径相同。

0 个答案:

没有答案