【问题标题】:Django rest framework migrating from 0.x to 2.1.9Django rest 框架从 0.x 迁移到 2.1.9
【发布时间】:2012-12-03 09:02:33
【问题描述】:

在从 django-rest-framwork 0.3.2 转换到最新的 2.1.9 时解决了我的一些麻烦后,我看不到修复这个问题(我同意 Reinout 的博客......这真的很痛苦在...)

我有这个代码:

class ApiSomeInputView(View):
    form = ApiSomeForm
    permissions = (IsAuthenticated, )
    resource=SomeResource


    def get(self, request):
        """
        Handle GET requests.
        """
        return "Error: No GET request Possible, use post"

    def post(self, request, format=None):
        some_thing =   self.CONTENT['some_thing']
        # check if something exist:
        something = get_object_or_none(Something,some_field=int(some_thing))
        if not something:
            raise _404_SOMETHING_NOT_FOUND
        #Note exludes are set in SomeResource
        data = Serializer(depth=4).serialize(something)
        return Response(status.HTTP_200_OK, data)

现在我已经按照教程进行操作,并了解了如何做到这一点(甚至可能更漂亮)。通过在 url 中使用 slug。

但是....我想让客户端软件向后兼容...所以我想在不将查询的值放在 url 中的情况下拥有它。客户端在post的header中使用json数据和ContentType json。

在 django rest 框架的第一个版本中,我什至得到了一个不错的可浏览表单,用于填写此查询的值

我的问题:如何在最新版本中完成这项工作?

我似乎无法在视图中获得表单......我可以在其中填写值并在过程中使用

或许可以把我尝试过的东西贴出来……

首先我在 Serializer 中更改了 ModelResource:

class SomethingSerializer(HyperlinkedModelSerializer):
    class Meta:
        model = Something
        #exclude = ('id',)
        depth = 4

然后视图变为:

class ApiSomeInputView(APIView):
    permissions = (IsAuthenticated, )

    def post(self, request, format=None):
        some_thing = request.DATA['some_thing']
        # check if something exist: .... well actually this above already does not work
        something = get_object_or_none(Something,some_field=int(some_thing))
        if not something:
            raise _404_SOMETHING_NOT_FOUND
        serializer = SomethingSerializer(something)
        return Response(status.HTTP_200_OK, serializer.data)

注意:根据接受的答案(汤姆克里斯蒂),我还提出了一个答案,其中我展示了我是如何工作的(更详细)。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    基于 Tom Christie 的回答(我会接受它作为答案)。我得到了它的工作:

    我制作了一个额外的序列化程序,它定义了要显示以填写帖子并使用 GenericAPIView 显示的字段...(如果我错了汤姆,请纠正我,只是在这里为其他人记录它...所以最好说正确)

    class SomethingSerializerForm(Serializer):
        some_thing = serializers.IntegerField()
    

    有了这个序列化器和我已经拥有的另一个序列化器。

    还有一个观点:

    class ApiSomeInputView(GenericAPIView):
        permissions = (IsAuthenticated, )
        model = Something
        serializer_class = SomethingSerializerForm
    
        def post(self, request, *args, **kwargs):
             serializer = self.get_serializer(data=request.DATA)
             if not serializer.is_valid():
                 raise ParseError(detail="No valid values")
             some_thing = request.DATA['some_thing']
             something = get_object_or_none(Something,some_field=int(some_thing))
             if not something:
                 raise Http404
             serializer = SomethingSerializer(something)
             return Response(serializer.data)
    

    上面的工作,和以前完全一样....

    我仍然觉得我在滥用 Serializer 类作为表单。

    【讨论】:

      【解决方案2】:

      当您从APIView 继承时,可浏览的 API 渲染器无法知道您想在 HTML 中使用什么序列化程序,因此它回退到允许您发布纯 JSON(或其他)表示。

      如果您改为从GenericAPIView 继承,使用serializer_class 属性设置序列化程序,并使用get_serializer(...) 方法-see here 获取序列化程序的实例,那么可浏览API 将使用表单显示用户输入。

      【讨论】:

      • 再次感谢您的快速回答!我希望得到你的答复!我认为看到这里的链接应该是:django-rest-framework.org/api-guide/…?马上去试试……
      • 我得到了这个答案,请你看看我的答案,我将你的答案转换为代码....因为我仍然觉得我在滥用序列化程序一个表格....
      猜你喜欢
      • 1970-01-01
      • 2013-11-05
      • 2013-10-21
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多