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

我是 Django REST 框架的初学者,需要你的建议。我正在开发一个网络服务。服务必须为其他服务提供 REST 接口。我需要实现的 REST 接口不能直接与我的模型一起工作(我指的是 get、 put、 post、 delete 操作)。相反,它提供一些计算结果的其他服务。对于请求,我的服务进行一些计算并返回结果(不将结果存储在自己的数据库中)。

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

  1. 创建进行计算的类。命名为“ CalcClass”。 CalcClass 在其工作中使用模型。
    • 计算所需的参数被传递给构造函数。
    • 实现计算操作。它返回结果为“ ResultClass”。
  2. 创建 ResultClass。
    • 从物体派生出来的。
    • 它只有包含计算结果的属性。
    • 计算结果的一部分表示为元组的元组。据我所知,进一步的序列化最好是为这些结果实现一个单独的类,并将这样的对象列表添加到 ResultClass 中。
  3. 为 ResultClass 创建序列化器。
    • 从序列化器派生。
    • 计算结果是只读的,因此对字段主要使用 Field 类,而不是专门的类,如 IntegerField。
    • 我不应该在 ResultClass 或 Serializer 上暗示 save ()方法,因为我不打算存储结果(我只是想在请求时返回它们)。
    • 提示嵌套结果的序列化程序(记住上面提到的元组的元组)。
  4. 创建视图以返回计算结果。
    • 源自 APIView。
    • 只需要得到()。
    • 在 get ()中,使用从请求中检索到的参数创建 CalcClass,调用它的 calc () ,获取 ResultClass,创建 Serializer 并将 ResultClass 传递给它,然后返回 Response (seralizer.data)。
  5. 网址
    • 我的案子里没有 api 根。我应该只有 URL 来获得各种计算结果(使用差异参数的计算)。
    • 为 api 浏览添加调用 format _ affix _ pattern。

我错过了什么吗? 这个方法总的来说是正确的吗?

51774 次浏览

Django-rest-Framework 即使不与模型绑定,也能很好地工作。你的方法听起来不错,但是我相信你可以修改一些步骤,让一切运转起来。

例如,rest 框架附带了一些内置的渲染器。它可以立即将 JSON 和 XML 返回给 API 使用者。您还可以通过安装所需的 python 模块来启用 YAML。Django-rest-Framework 将输出任何基本对象,比如 dict、 list 和 tuple,而不需要你做任何额外的工作。

因此,基本上您只需要创建一个函数或类,该函数或类接受参数,执行所有必需的计算,并将其结果以元组的形式返回给 REST api 视图。如果 JSON 和/或 XML 符合您的需要,django-rest-Framework 将为您处理序列化。

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

这里有一些片段可以帮助你:

请注意,我还没有测试这个。它只是作为一个例子,但它应该可以工作:)

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

你的网址:

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时,这段代码应该输出一个列表列表。如果使用后缀,可以用 .json替换 ?format=json。您还可以通过将 "Content-type""Accept"添加到标题中来指定希望返回的编码。

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

希望这能帮到你。