Django REST框架:非模型序列化器

我是Django REST框架的初学者,需要你的build议。 我正在开发一个Web服务。 该服务必须提供REST接口到其他服务。 REST接口,我需要实现,不直接与我的模型(我的意思是得到,放,发布,删除操作)。 相反,它提供了一些计算结果的其他服务。 在请求我的服务进行一些计算,只是返回结果(不会将结果存储在自己的数据库中)。

以下是我对如何实现REST接口的理解。 纠正我,如果我错了。

  1. 创build进行计算的类。 将其命名为“CalcClass”。 CalcClass在其工作中使用模型。
    • 计算所需的parameter passing给构造函数。
    • 执行计算操作。 它将结果作为“ResultClass”返回。
  2. 创buildResultClass。
    • 从对象派生。
    • 它只是具有包含计算结果的属性。
    • 计算结果的一部分被表示为元组的元组。 据我所知,进一步的序列化将更好地为这些结果实现一个单独的类,并将这些对象的列表添加到ResultClass。
  3. 为ResultClass创build序列化程序。
    • 从serializers.Serializer派生。
    • 计算结果是只读的,因此主要使用Field类的字段,而不是专门的类,如IntegerField。
    • 我不应该在ResultClass和Serializer上impl save()方法,因为我不打算存储结果(我只是想根据请求返回它们)。
    • 用于嵌套结果的Impl序列化器(记得上面提到的元组的元组)。
  4. 创build视图来返回计算结果。
    • 从APIView派生。
    • 只需要得到()。
    • 在get()中创buildCalcClass,并从请求中获取参数,调用它的calc(),得到ResultClass,创buildSerializer并将ResultClass传递给它,返回Response(serializer.data)。
  5. url
    • 在我的情况下没有api根。 我应该只有url来获得各种计算结果(与差异参数计算)。
    • 添加调用format_suffix_patterns为api浏览。

我错过了什么? 这个方法一般是正确的吗?

Django-rest-framework即使不绑定到模型也可以很好地工作。 你的方法听起来不错,但我相信你可以修剪一些步骤,使一切工作。

例如,rest框架附带一些内置的渲染器。 开箱即可将JSON和XML返回给API使用者。 你也可以通过安装所需的python模块来启用YAML。 Django的rest框架将输出任何基本的对象,如字典,列表和元组,而无需任何额外的工作。

所以基本上你只需要创build接受参数的函数或类,完成所有需要的计算并将其结果返回到REST API视图。 如果JSON和/或XML符合您的需求,django-rest-framework将为您处理序列化。

在这种情况下,您可以跳过第2步和第3步,只需使用一个类进行计算,另一个用于向API使用者演示。

这里有几个片段可以帮助你:

请注意,我没有testing过这个。 这只是作为一个例子,但它应该工作:)

CalcClass:

class CalcClass(object): def __init__(self, *args, **kw): # Initialize any variables you need from the input you get pass def do_work(self): # Do some calculations here # returns a tuple ((1,2,3, ), (4,5,6,)) result = ((1,2,3, ), (4,5,6,)) # final result return result 

REST视图:

 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from MyProject.MyApp import CalcClass class MyRESTView(APIView): def get(self, request, *args, **kw): # Process any get params that you may need # If you don't need to process get params, # you can skip this part get_arg1 = request.GET.get('arg1', None) get_arg2 = request.GET.get('arg2', None) # Any URL parameters get passed in **kw myClass = CalcClass(get_arg1, get_arg2, *args, **kw) result = myClass.do_work() response = Response(result, status=status.HTTP_200_OK) return response 

你的urls.py:

 from MyProject.MyApp.views import MyRESTView from django.conf.urls.defaults import * urlpatterns = patterns('', # this URL passes resource_id in **kw to MyRESTView url(r'^api/v1.0/resource/(?P<resource_id>\d+)[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'), url(r'^api/v1.0/resource[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'), ) 

当您访问http://example.com/api/v1.0/resource/?format=json时,此代码应输出列表。; 如果使用后缀,则可以用.jsonreplace?format=json 。 您也可以通过在标题中添加"Content-type""Accept"来指定您希望获得的编码。

 [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] 

希望这可以帮助你。