Djagno rest просмотр структуры файлов со сложными вычислениями
Я пишу django rest api. Я буду принимать форму, которая будет отправляться с фронтенда. Форма будет содержать данные, которые я буду использовать для вычисления. Но есть проблема. На основе данных формы код должен выполнять различные типы вычислений. Например form
{
"type": 1,
"form": 3,
"method": 4
... more data
}
Тогда я должен прочитать "type". Он должен привести остальную часть формы к другому методу View, называемому, например, type1. Затем, используя "form", он должен перейти к другому методу вида form3 и т.д. Должен ли я написать этот длинный api методов представления или, возможно, я должен создать другой файл для выполнения вычислений на основе данных формы? Методы вычислений действительно разные, поэтому невозможно основываться на одном методе и нескольких ifs.
Пример (я не буду прикреплять туда валидацию сериализатора и т.д.):
class SubmissionView(APIView):
def post(self, request):
if request['type'] == 1:
self.type1(request.data)
elif request['type'] == 2:
self.type2(request.data)
........
def type1(self, request_data):
if request['form'] == 1:
self.form1(request.data)
elif request['form'] == 2:
self.form2(request.data)
etc...
Я не уверен, что понимаю вашу проблему. Но если вы просто хотите упростить свой код, я предлагаю следующее
Создайте словарь для отображения методов на основе вводимых данных вашей формы следующим образом:
class SubmissionView(APIView):
function_map = {
"1" : { # Is the type 1
"1" : { # Is the form
"1" : self.my_fun_a, # Is the method 1
"2" : self.my_fun_b # Is the method 2
},
"2" : { # Is the type 2
"1" : ...,
"1" : ...
},
}
...
}
def post(self, request):
type_value = request['type'] # make sure it's string
form_value = request['form'] # make sure it's string
method_value = request['method'] # make sure it's string
data1 = request['data1']
data2 = request['data2']
# ...
if type_value in self.function_map.keys():
type_map = function_map[type_value]
if form_value in type_map.keys():
form_map = type_map[form_value]
if method_value in form_map.keys():
method_map = form_map[method_value]
# Call method here
return Response( method_map(data1, data2, ...) )
else:
# error
else:
# error
else:
# error
def my_fun_a(self, *args, **kwargs):
# Compute
return result
def my_fun_b(self, *args, **kwargs):
# Compute
return result