【问题标题】:create() takes 1 positional argument but 2 were given. Django rest framework,. How to slove it?create() 接受 1 个位置参数,但给出了 2 个。 Django 休息框架,。如何解决?
【发布时间】:2026-01-26 15:10:01
【问题描述】:

我是 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

  

在我看来.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) 
      

在我的网址中:

  router.register(r'register', SchoolViewSet)

 

 

【问题讨论】:

  • student='student' 看起来很奇怪。您的 .create(...) 方法需要一个可迭代的字典,而不是字符串。
  • 你的意思是应该是 student=**student_data 吗?-@WillemVanOnsem

标签: django django-rest-framework django-views


【解决方案1】:

在创建函数中,你不应该解压验证数据。所以创建函数定义应该是这样的

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) 

【讨论】:

  • 它有效,它只发布了学校领域而不是学生,我得到了以下类型错误:django.db.models.manager.BaseManager._get_queryset_methods..create_method. ** 之后的 .manager_method() 参数必须是映射,而不是 str- @kuba Ronkiewicz
最近更新 更多