Django Rest framework: немодельный сериализатор



Я новичок в Django Rest framework и нуждаюсь в вашем совете. Я разрабатываю веб-сервис. Служба должна предоставлять интерфейс REST для других служб. Интерфейс REST, который мне нужно реализовать, не работает с моими моделями напрямую (я имею в виду операции get, put, post, delete). Вместо этого он предоставляет другие услуги с некоторыми результатами расчета. По запросу мой сервис делает некоторые вычисления и просто возвращает результаты обратно (не сохраняет результаты в своей собственной базе данных).

ниже мое понимание того, как этот интерфейс REST может быть реализован. Поправьте меня, если я ошибаюсь.

  1. создать класс, который делает расчеты. Название CalcClass'. CalcClass использует модели в своей работе.
    • параметры, необходимые для вычислений, передаются конструктору.
    • реализовать операцию calc. Он возвращает результаты как "ResultClass".
  2. создать ResultClass.
    • производное от объекта.
    • Он просто имеет атрибуты, содержащие результаты calc.
    • одна часть результатов calc представлена в виде кортежа кортежей. Как я понимаю, для дальнейшей сериализации было бы лучше реализовать отдельный класс для этих результатов и добавить список таких объектов в ResultClass.
  3. создать сериализатор для ResultClass.
    • вытекают из сериализаторы.Сериализатор.
    • результаты calc доступны только для чтения, поэтому используйте в основном класс поля для полей, а не специализированные классы, такие как IntegerField.
    • Я не должен использовать метод save() ни на ResultClass, ни на Serializer, потому что я не собираюсь хранить результаты (я просто хочу вернуть их по запросу).
    • impl сериализатор для вложенных результатов (помните кортеж кортежей, упомянутых выше).
  4. создать вид возврат результатов расчета.
    • производные от APIView.
    • нужно просто сделать().
    • в get() создайте CalcClass с параметрами, полученными из запроса, вызовите его calc (), получите ResultClass, создайте сериализатор и передайте ему ResultClass, верните ответ(сериализатор.данные.)
  5. URLs
    • в моем случае нет корня api. Я должен просто иметь URL-адреса, чтобы получить различные результаты calc (calc с разными параметрами).
    • добавить вызов format_suffix_patterns для просмотра api.

Я что-то пропустил? Является ли подход правильным в целом?

230   1  

1 ответ:

Django-rest-framework работает хорошо, даже не привязывая его к модели. Ваш подход звучит нормально, но я считаю, что вы можете обрезать некоторые шаги, чтобы все работало.

например, Rest framework поставляется с несколькими встроенными рендерами. Из коробки он может вернуть JSON и XML для потребителя API. Вы также можете включить YAML, просто установив необходимый модуль python. 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

остальные вид:

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
  ]
]

надеюсь,что это поможет вам.

    Ничего не найдено.

Добавить ответ:
Отменить.