Django e REST API para servir pedidos baseados em cálculos

Eu escrevi um aplicativo de aprendizado de máquina no Django para que um usuário possa especificar em um formulário alguns parâmetros e treinar um modelo. Depois que o modelo for treinado, quero atender a solicitações como:

curl http://localhost:8000/.../?model_input='XYZ' 

e eu quero que o Django retorne a saída do modelo dada a input XYZ. Todos os exemplos que vi do framework Tastypie ou REST constroem sua resposta a partir de um queryset. Como posso proceder se a resposta não for o resultado de um queryset, mas o resultado de um cálculo puro na memory? No meu caso, a resposta é o resultado de uma multiplicação de matriz (o modelo treinado) por um vetor (a input) e esse resultado não é armazenado em uma tabela.

Qual é a maneira recomendada de gerenciar tais solicitações? Qualquer ajuda é muito apreciada. Atenciosamente, Patrick

O Django REST Framework não requer uma fonte de modelo, ou um queryset, embora tenha o melhor desempenho ao trabalhar com qualquer um deles. Ele fornece um Serializer básico por este motivo, bem como classs APIView básicas para permitir a negociação de conteúdo para ser usado em cima de visualizações padrão baseadas em classs do Django.

Você provavelmente não precisará usar o Serializer menos que esteja procurando serializar o object de resultados. O outro uso comum de um Serializer é validar os dados recebidos e convertê-los em um formato esperado.

Se você estava apenas olhando para retornar um valor básico (você não especificou o que “o resultado de uma multiplicação de matrizes” realmente poderia ser), então mesmo usando apenas as visualizações básicas é um passo acima de fazer tudo manualmente. O object Response que o Django REST Framework fornece permite que você retorne dados arbitrários e faça com que ele seja convertido em uma representação JSON ou XML comparável, automaticamente. Você nunca precisa chamar json.dumps ou coagir os dados em uma representação específica, o object Response faz tudo para você.

 from rest_framework.response import Response from rest_framework import serializers, views class IncredibleInputSerializer(serializers.Serializer): model_input = serializers.CharField() class IncredibleView(views.APIView): def get(self, request): # Validate the incoming input (provided through query parameters) serializer = IncredibleInputSerializer(data=request.query_params) serializer.is_valid(raise_exception=True) # Get the model input data = serializer.validated_data model_input = data["model_input"] # Perform the complex calculations complex_result = model_input + "xyz" # Return it in your custom format return Response({ "complex_result": complex_result, }) 

No exemplo acima, criamos um IncredibleInputSerializer que valida o parâmetro de consulta model_input para garantir que ele seja incluído na solicitação. Este é um exemplo muito básico, pois o Django REST Framework suporta fazer coisas adicionais à input, como convertê-lo em um número ou validar que ele está em conformidade com um formato específico.

Claro, se você precisar serializar um object ou lista de objects, é aí que o Django REST Framework se destaca. Ele não precisa ser um object de modelo, pode ser um object com atributo ou methods para obter os dados, ou mesmo apenas um dictionary básico, e o Django REST Framework deve ser capaz de serializá-lo para você.