Правильный способ создания конечной точки django rest без модели

Мне нужно создать конечную точку API, которая будет принимать данные из тела запроса GET. Он будет находить необходимые данные в уже созданной базе данных для выполнения расчета, а затем возвращать результат расчета в качестве ответа.

Так что я нашел способ сделать это, но я не уверен, что это должно выглядеть так. Это работает, но вы знаете :)

urls.py

schema_view = get_schema_view(
openapi.Info(
      title="API Test",
      default_version='0.0.1',
      description="Test",
   ),
   public=True,
)

urlpatterns = [
   path('docs/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
   path('equation/1/example', EquationView.as_view()), 
   #... more paths to other equations...
]

view.py

def get_emission_val(req_emiss_fac):
    try:
        return Emission.objects.get(emission_factor=req_emiss_fac)
    except Emission.DoesNotExist:
        raise Http404("Emission value does not exist in database")

equation_response = openapi.Response('response description', EquationResponseSerializer)
@swagger_auto_schema(
    query_serializer=EquationRequestSerializer,
    responses={
        '404':'Emission factor does not exist in database', 
        '200': equation_response
    },
    )
class EquationView(APIView):
    def get(self, request):
        emission_val = get_emission_val(request.data['emission_factor'])
        combusted_val = request.data['combusted_value']
        emissions = combusted_val * emission_val.co2_emission
        return Response({'emissions':emissions})

serializers.py

class EquationRequestSerializer(serializers.Serializer):
    emission_factor = serializers.CharField()
    combusted_value = serializers.FloatField()


class EquationResponseSerializer(serializers.Serializer):
    emission = serializers.FloatField()

Что вы думаете о таком подходе? Я не уверен, что должен делать это именно так. Я использую swagger и дополнительные сериализаторы для генерирования api docs

Пример получения тела запроса:

{
    "emission_factor":"Test",
    "combusted_value":1.0
}

Пример ответа:

{
    "emissions": 1.5129
}
Вернуться на верх