serializermethodfield password framework errors create django rest django-rest-framework

password - Marco Django REST: serializador no modelo



serializer errors django (1)

Soy principiante en el marco de Django REST y necesito tu consejo. Estoy desarrollando un servicio web. El servicio debe proporcionar una interfaz REST a otros servicios. La interfaz REST, que necesito implementar, no está funcionando directamente con mis modelos (me refiero a las operaciones get, put, post, delete). En cambio, proporciona otros servicios con algunos resultados de cálculo. A petición, mi servicio hace algunos cálculos y simplemente devuelve los resultados (no almacena los resultados en su propia base de datos).

Debajo está mi comprensión de cómo esa interfaz REST podría ser implementada. Corrígeme si estoy equivocado.

  1. Crear clase que hace los cálculos. Llámalo ''CalcClass''. CalcClass usa los modelos en su trabajo.
    • Los parámetros necesarios para los cálculos se pasan al constructor.
    • Implementa la operación calc. Devuelve resultados como ''ResultClass''.
  2. Crear ResultClass.
    • Derivado del objeto.
    • Solo tiene atributos que contienen los resultados calcificados.
    • Una parte de los resultados calculados se representa como una tupla de tuplas. Según entiendo, sería mejor para la serialización posterior implementar una clase separada para esos resultados y agregar una lista de dichos objetos a ResultClass.
  3. Crear serializador para ResultClass.
    • Derivar de los serializadores. Serializador.
    • Los resultados calculados son de solo lectura, por lo tanto, utilice principalmente la clase de campo para campos, en lugar de clases especializadas, como IntegerField.
    • No debería aplicar el método save () ni en ResultClass, ni en Serializer, porque no voy a almacenar los resultados (solo quiero devolverlos a petición).
    • El serializador Impl para los resultados anidados (recuerda la tupla de las tuplas mencionadas anteriormente).
  4. Crear vista para devolver los resultados del cálculo.
    • Derive de APIView.
    • Necesito solo get ().
    • En get () crea CalcClass con params recuperados de la solicitud, llama a su calc (), obtén ResultClass, crea Serializer y pasa el ResultClass a él, devuelve Response (serializer.data).
  5. URLs
    • No hay una raíz api en mi caso. Debería tener URL para obtener varios resultados de cálculo (calc con parámetros de diferencias).
    • Agregue llamadas format_suffix_patterns para la navegación de API.

¿Me he perdido algo? ¿El enfoque es correcto en general?


Django-rest-framework funciona bien incluso sin vincularlo a un modelo. Su enfoque suena bien, pero creo que puede recortar algunos de los pasos para que todo funcione.

Por ejemplo, el marco de descanso viene con algunos renderizadores incorporados. De fábrica, puede devolver JSON y XML al consumidor API. También puede habilitar YAML simplemente instalando el módulo python requerido. Django-rest-framework generará cualquier objeto básico como dict, list y tuple sin ningún trabajo adicional de su parte.

Entonces, básicamente, solo tiene que crear la función o clase que toma argumentos, hace todos los cálculos requeridos y devuelve sus resultados en una tupla a la vista de la API REST. Si JSON y / o XML se ajustan a sus necesidades, django-rest-framework se ocupará de la serialización por usted.

Puede omitir los pasos 2 y 3 en este caso, y solo usar una clase para los cálculos y una para la presentación al consumidor API.

Aquí hay algunos fragmentos que pueden ayudarlo:

Tenga en cuenta que no he probado esto. Solo sirve como ejemplo, pero debería funcionar :)

La clase de Calc:

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

La vista 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

Tu 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''), )

Este código debería generar una lista de listas cuando ingrese a http://example.com/api/v1.0/resource/?format=json . Si usa un sufijo, puede sustituir ?format=json con .json . También puede especificar la codificación que desea recuperar agregando "Content-type" o "Accept" a los encabezados.

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

Espero que esto te ayude.