Create() принимает 1 позиционный аргумент, но было задано 2. Django rest framework,. Как его использовать?

Я новичок в Django restframework Я хочу зарегистрировать нового ученика в школе, но это не работает. Я перепробовал много решений. Вот что я получил: create() принимает 1 позиционный аргумент, но при попытке отправить сообщение было дано 2. Я не уверен, что мой код в наборе представлений правильный. Кто-нибудь может мне помочь?

 In my serializers.py:
 class StudentSerializer(serializers.Serializer):
  class Meta:
    model = Student
    fields = ['first_name']


class SchoolSerializer(serializers.Serializer):
is_existing_student = = serializers.BooleanField()
student = StudentSerializer(many=True)

 class Meta:
    model = School
    fields = ['is_existing_student', 'name', 'city', 'street', 'student']

  def create(self, **validated_data):
    student_data = validated_data.pop('student')
    school_instance = School.objects.create(**validated_data)
    for student_data in student_data:
        Student.objects.create(school_instance=school_instance, **student_data)
    return school_instance

  

В моем файле views.py:

  class SchoolViewSet(mixins.CreateModelMixin, RetrieveModelMixin, 
  ListModelMixin, GenericViewSet):

      serializer_class = SchoolSerializer
      queryset = School.objects.all()

      @action(detail=True, methods=['POST'])
      def school(self, request, *args, **kwargs):
          school = self.get_object()
          if serializer.is_valid():
             School.create(school=school, name='name', street='street', city='city', 
                           student='student')
             school.save()
          else:
             return Response(status=status.HTTP_204_NO_CONTENT) 
      

В моем url:

  router.register(r'register', SchoolViewSet)

 

 

В функции create не следует распаковывать validated_data. Поэтому определение функции create должно выглядеть следующим образом

class SchoolSerializer(serializers.Serializer):
 is_existing_student = = serializers.BooleanField()
 student = StudentSerializer(many=True)

 class Meta:
    model = School
    fields = ['is_existing_student', 'name', 'city', 'street', 'student']

  def create(self, validated_data):
    student_data = validated_data.pop('student')
    school_instance = School.objects.create(**validated_data)
    for student_data in student_data:
        Student.objects.create(school_instance=school_instance, **student_data)
    return school_instance

Также в части представления вы дублируете создание объекта School. Сериализатор уже отвечает за создание экземпляра школы

  class SchoolViewSet(mixins.CreateModelMixin, RetrieveModelMixin, 
  ListModelMixin, GenericViewSet):

      serializer_class = SchoolSerializer
      queryset = School.objects.all()

      @action(detail=True, methods=['POST'])
      def school(self, request, *args, **kwargs):
          school_serializer = self.get_serializer(data=request.data)
          if school_serializer.is_valid():
             school_serializer.save()
          else:
             return Response(status=status.HTTP_204_NO_CONTENT) 
Вернуться на верх