Два метода post в одном представлении на основе класса

#python #django #api

#python #django #API

Вопрос:

Есть ли возможность иметь 2 метода post в одном представлении на основе класса?

Я пытался сделать что-то подобное, но, конечно, это не работает

Мой пользовательский вид:

 class UserExamDetail(APIView):

    def get_queryset(self, pk):
        return Exam.objects.get(pk=pk)

    def get(self, request, pk):
        exam = self.get_queryset(pk=pk)
        if exam:
            exam_closed = 0
            exam_opened = 0
            c_questions = ClosedQuestion.objects.filter(exam=exam)
            o_questions = OpenedQuestion.objects.filter(exam=exam)
            for question in c_questions:
                points = int(question.points)
                exam_closed  = points
            for question in o_questions:
                points = int(question.points)
                exam_opened  = points
            exam.score = exam_closed   exam_opened
            exam.save()
        serializer = ExamCreatorSerializer(exam)
        return Response(serializer.data)

    def post(self, request, pk):
        serializer = ClosedQuestionSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(exam=pk)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

    def post(self, request, pk):
        serializer = OpenedQuestionSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(exam=pk)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)

  

Работает только первый post, и когда я пытаюсь изменить имя функции, например: post1 и post 2, тогда Django не распознает этот метод как post. Если есть возможность сделать это, то мне также интересно, должен ли я делать такой вид просмотра или, может быть, методы Post должны быть отдельными представлениями?

Комментарии:

1. В коде изменяется только сериализатор, поэтому вы должны уметь комбинировать их в одной функции post и выполнять некоторые действия, если хотите использовать один сериализатор поверх другого. Возможно, вы можете передать другой параметр в представление.

2. Можете ли вы объяснить условие для этого случая? Какая ситуация заставляет вас требовать что-то вроде двух методов post?

3. Нет. У вас может быть только один метод post. Вам нужно добавить условие для изменения сериализатора

4. Итак, это приложение, задача которого — создать экзамен (модель «Экзамен»), и сначала в другом представлении я создаю экзамен, а затем я собираюсь подробно просмотреть этот новый экзамен, где я могу добавлять вопросы, и есть 2 типа вопросов. закрыт (модель «ClosedQuestion) и открыт (модель «OpenedQuestion»), и я хочу иметь возможность добавить эти 2 типа вопросов в одно представление

Ответ №1:

Вы могли бы передать дополнительные данные в тело запроса и решить, какой сериализатор использовать. Вот пример.

 def post(self, request, pk):
    if request.POST.get('is_opened'):
        serializer_class = OpenedQuestionSerializer
    else:
        serializer_class = ClosedQuestionSerializer

    serializer = serializer_class(data=request.data)
    if serializer.is_valid():
        serializer.save(exam=pk)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
  

Комментарии:

1. хорошо, но как view узнает, какой сериализатор использовать, я, вероятно, должен использовать другой URL, да? Но тогда это будет всего 2 разных представления

2. Но это все равно будет лучше, потому что мне не придется писать два очень похожих представления на основе классов. Итак, в заключение я должен создать два URL-адреса, чтобы выбрать, какой сериализатор использовать да?

3. Просто включите is_opened с некоторым значением в текст вашего запроса на случай, если вы хотите использовать OpenedQuestionSerializer .