【问题标题】:Django REST difference in views and viewsets视图和视图集的 Django REST 差异
【发布时间】:2020-10-05 16:55:52
【问题描述】:

我有一个相当简单的 REST api,但我仍然不明白视图类型之间的区别。任何与模型相关的事情,我都是通过 ModelViewSets 和 ModelSerializers 来完成的。可以用路由器,swagger docs里有参数,都好!

但是,如果我没有模型(例如,我有一个接受 2 个参数(var1 和 var2)的函数并且 POST 请求将它们相乘,那么我最好的选择是什么?我更喜欢涉及序列化程序的选项,因为我我希望获得 Swagger 文档中显示的参数。我知道我有 ViewSet 选项,但它没有给我 swagger 中的参数。有没有任何选项可以给我这些选项?

编辑: 我确实找到了一个半解决方案。请看以下代码:

class Test1(generics.GenericAPIView):
    """
    Test
    """
    def get_queryset(self):
        print(123)
        return []

    def get_serializer_class(self):
        return Test1Serializer
    
    def get(self, request):
        print('abc')
        return Response([1, 2, 3])
    
    def post(self, request):
        #multiply var1 and var2 here and return the result

在这个例子中,我使用了 get_queryset 方法,但我不会使用它(所以它充当了一个虚拟对象)。我可以让那个函数返回一些空数组吗?那会发生什么?有更好的解决方案吗?我觉得我在这里滥用了 GenericAPIView 的使用。使用普通的 ViewSet 没有更好的解决方案吗?

EDIT2:我稍微更新了上面的代码。现在看起来像这样:

class Test1(generics.GenericAPIView):
    """
    Test
    """
    serializer_class = Test1Serializer
    
    def get_queryset(self):
        print('Running get_queryset')
        return [1, 2, 3, 4]
    
    def get(self, request):
        data = self.get_queryset()
        print('Queryset data', data)
        return Response(data)
    
    def post(self, request):
        return Response([1, 2, 3])

我没有将 get_queryset 用作虚拟对象,但我可以在其中执行 GET 请求代码。如果我发布请求,此代码不会运行吗?我这样做对吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我假设您使用的是 django rest_framework。因此,如果您有一个带有两个参数的函数并且您想发布该请求。您可以简单地为您的发布请求使用基于功能的视图和 @api_view 装饰器,以便您能够使用响应。所以你可以尝试这样的事情:

    from rest_framework.decorators import api_view
    @api_view(['POST'])
    def my_post_function(request, var1, var2):
        if request.method == 'POST':
            multi_result = var1*var2
            '''
            Do your post staff
            '''
            return Response({{"message": "Data posted", "data": request.data}})
    

    要阅读有关基于功能的视图的更多信息,您可以查看文档https://www.django-rest-framework.org/api-guide/views/

    【讨论】:

    • 感谢您的回答。我知道基于函数的视图。但这并不能回答我的问题。它们不会出现在 swagger 文档中,我喜欢这些类,因为它们将不同的功能组合在一起
    • 我很抱歉我误解了这个问题
    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2015-08-04
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多