当前位置: 首页 > 知识库问答 >
问题:

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

姬庆
2023-03-14

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

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

  • 创建进行计算的类。将其命名为“CalcClass”。CalcClass在其工作中使用模型。
    • 计算所需的参数传递给构造函数。
    • 执行calc操作。它以“ResultClass”的形式返回结果。
    • 派生自对象。
    • 它仅具有包含计算结果的属性。
    • calc结果的一部分表示为元组的元组。据我所知,为了进一步序列化,最好为这些结果实现一个单独的类,并将这些对象的列表添加到ResultClass中。
    • 从Serializers.Serializer派生。
    • 计算结果是只读的,因此对于字段主要使用Field类,而不是专用的类,如IntegerField。
    • 我不应该在ResultClass和Serializer上使用save()方法,因为我不打算存储结果(我只想在请求时返回它们)。
    • 嵌套结果的IMPL序列化程序(记住上面提到的元组的元组)。
    • 从APIView派生。
    • 只需要get()。
    • 在get()中,使用从请求中检索的参数创建CalcClass,调用其calc(),获取ResultClass,创建Serializer并将ResultClass传递给它,返回响应(Serializer.data)。
    • 在我的示例中没有api root。我应该只有URL来获得各种计算结果(具有不同参数的计算结果)。
    • 为api浏览添加调用format_suffix_patterns。

    我错过什么了吗?这个方法大体上是正确的吗?

共有1个答案

常雪风
2023-03-14

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

您的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。您还可以通过向标头添加“content-type”“accept”来指定希望返回的编码。

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

希望这能帮到你。

 类似资料:
  • 问题内容: 我是Django REST框架的初学者,需要你的建议。我正在开发Web服务。该服务必须提供与其他服务的REST接口。我需要实现的REST接口无法直接与我的模型一起使用(我的意思是获取,放置,发布,删除操作)。相反,它为其他服务提供了一些计算结果。根据请求,我的服务会进行一些计算,只是将结果返回(不将结果存储在自己的数据库中)。 以下是我对如何实现REST接口的理解。纠正我,如果我错了。

  • 问题内容: 想知道javascript中是否有没有jquery的函数或任何允许我序列化表单并访问序列化版本的框架? 问题答案: 小型from-serialize库不依赖框架。除此之外,您还需要自己实现序列化功能。(尽管重量为1.2KB,为什么不使用它?)

  • 问题内容: 像其他几个人一样,我在序列化Entity Framework对象时遇到问题,因此我可以通过JSON格式的AJAX发送数据。 我有以下服务器端方法,我正在尝试通过jQuery使用AJAX进行调用 通过AJAX调用会导致此错误: 这是因为实体框架创建循环引用以保持所有对象相关并且可访问服务器端的方式。 我从(http://hellowebapps.com/2010-09-26/produc

  • 我对django rest框架有一个关于泛型关系的小问题,这个泛型关系也用于唯一的约束。 我有这个模型: 它有一个通用关系和一个唯一的约束:专有网络的名称和通用关系(即所有者)。 以下是序列化程序: 在字段中,我不把content_type和object_id,因为我不想让用户显示/设置它们。 但是,我必须把它们放在UniqueTobetherValidator中,以避免在创建具有相同帐户/名称的

  • 我用的是Django 2。十、 我有一个用于验证请求的序列化程序。(不是ModelSerializer) 是对模型的引用。 我希望用户在字段中传递数据库id,但在验证后,got被转换为对象。 我试图重写方法,并将对象分配给字段,但它给出了错误

  • 本文向大家介绍Django框架序列化与反序列化操作详解,包括了Django框架序列化与反序列化操作详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Django框架序列化与反序列化操作。分享给大家供大家参考,具体如下: Serializer类 1.定义: Django REST framework中的Serializer使用类来定义,须继承rest_framework.serialize