gpt4 book ai didi

Django REST 框架 : non-model serializer

转载 作者:行者123 更新时间:2023-11-28 19:32:21 28 4
gpt4 key购买 nike

我是 Django REST 框架的初学者,需要您的建议。我正在开发一个网络服务。该服务必须为其他服务提供 REST 接口(interface)。我需要实现的 REST 接口(interface)不直接与我的模型一起工作(我指的是获取、放置、发布、删除操作)。相反,它为其他服务提供一些计算结果。根据请求,我的服务进行一些计算并返回结果(不将结果存储在自己的数据库中)。

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

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

我错过了什么吗?该方法总体上是否正确?

最佳答案

Django-rest-framework 即使没有绑定(bind)到模型也能很好地工作。您的方法听起来不错,但我相信您可以减少一些步骤以使一切正常。

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

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

在这种情况下,您可以跳过第 2 步和第 3 步,只使用一个类进行计算,一个类用于呈现给 API 使用者。

以下是一些可能对您有所帮助的片段:

请注意,我还没有对此进行测试。这只是一个例子,但它应该有效:)

计算类:

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 View :

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

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

关于Django REST 框架 : non-model serializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13603027/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com