Django Rest framework: немодельный сериализатор
Я новичок в Django Rest framework и нуждаюсь в вашем совете. Я разрабатываю веб-сервис. Служба должна предоставлять интерфейс REST для других служб. Интерфейс REST, который мне нужно реализовать, не работает с моими моделями напрямую (я имею в виду операции get, put, post, delete). Вместо этого он предоставляет другие услуги с некоторыми результатами расчета. По запросу мой сервис делает некоторые вычисления и просто возвращает результаты обратно (не сохраняет результаты в своей собственной базе данных).
ниже мое понимание того, как этот интерфейс REST может быть реализован. Поправьте меня, если я ошибаюсь.
- создать класс, который делает расчеты. Название CalcClass'. CalcClass использует модели в своей работе.
- параметры, необходимые для вычислений, передаются конструктору.
- реализовать операцию calc. Он возвращает результаты как "ResultClass".
- создать ResultClass.
- производное от объекта.
- Он просто имеет атрибуты, содержащие результаты calc.
- одна часть результатов calc представлена в виде кортежа кортежей. Как я понимаю, для дальнейшей сериализации было бы лучше реализовать отдельный класс для этих результатов и добавить список таких объектов в ResultClass.
- создать сериализатор для ResultClass.
- вытекают из сериализаторы.Сериализатор.
- результаты calc доступны только для чтения, поэтому используйте в основном класс поля для полей, а не специализированные классы, такие как IntegerField.
- Я не должен использовать метод save() ни на ResultClass, ни на Serializer, потому что я не собираюсь хранить результаты (я просто хочу вернуть их по запросу).
- impl сериализатор для вложенных результатов (помните кортеж кортежей, упомянутых выше).
- создать вид возврат результатов расчета.
- производные от APIView.
- нужно просто сделать().
- в get() создайте CalcClass с параметрами, полученными из запроса, вызовите его calc (), получите ResultClass, создайте сериализатор и передайте ему ResultClass, верните ответ(сериализатор.данные.)
- URLs
- в моем случае нет корня api. Я должен просто иметь URL-адреса, чтобы получить различные результаты calc (calc с разными параметрами).
- добавить вызов format_suffix_patterns для просмотра api.
Я что-то пропустил? Является ли подход правильным в целом?
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 ] ]надеюсь,что это поможет вам.
Comments