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
Вернуться на верх