Правильный способ создания конечной точки 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
}