Django休息框架从0.x迁移到2.1.9

时间:2012-12-15 17:06:57

标签: django django-rest-framework

在从django-rest-framwork 0.3.2转换为lates 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)

现在我已经按照教程看了你如何做到这一点(甚至可能更漂亮)。通过在网址中使用slug。

然而......我想让后端兼容客户端软件......所以我希望在没有将查询的值放在url中的情况下这样做。客户端在帖子的标题中使用json数据和ContentType json。

在django rest framwork的第一个版本中,我甚至有一个很好的可浏览形式,可以填写此查询的值

我的问题:如何在最新版本中完成此操作?

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

也许很好发布我已经尝试过的东西直到发牢骚......

首先我在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)

注意:基于接受的答案(汤姆克里斯蒂),我也给出了一个答案,其中我展示了我如何使其工作(更详细)。

2 个答案:

答案 0 :(得分:2)

当您从APIView继承时,可浏览的API呈现器无法知道您要在HTML中使用哪个序列化程序,因此它可以回退到允许您发布普通JSON(或无论如何表示。

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

答案 1 :(得分:0)

根据汤姆克里斯蒂的答案(我接受作为答案)。我得到了它的工作:

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

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类作为Form。