为viewset get方法创建具有多个过滤器的新视图集

时间:2019-07-03 00:11:41

标签: python django django-rest-framework

嗨,我有一个正在创建的视图集。我想越过get functino并获取具有已过滤参数的所有记录,该参数已传递到get视图中。我还希望能够完成其余的Crud功能-GET POST PUT DELETE-并使用通过url传递的参数作为POST和UPDATE的参数。

现在,当我传入参数时,而不是过滤返回的数据,这没有给我找到细节,这不是我想要的。我希望它可用作我从数据库取回的所有记录的辅助筛选器。

代码如下:

视图集

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)

网址:

    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 :(得分:0)

我认为您不应该将名称空间添加为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()
        namespace = request.GET.get('namespace', None)
        if namespace:
             queryset = queryset.filter(user_id=1, namespace=namespace)
        serializer = PreferenceSerializer(queryset, many=True)
        return Response(serializer.data)