create() 采用 1 个位置参数,但给出了 2 个。 Django 休息框架,。如何解决?
create() takes 1 positional argument but 2 were given. Django rest framework,. How to slove it?
我是 Django restframework 的新手 我想为一名新生注册学校,但它不起作用。我尝试了很多解决方案。我得到的 is:create() 需要 1 个位置参数,但是当我尝试 post 时给出了 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)
在创建函数中,你不应该解包validated_data。所以创建函数定义应该是这样的
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
同样在视图部分,您复制了学校对象的创建。序列化程序已经负责创建学校实例
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 restframework 的新手 我想为一名新生注册学校,但它不起作用。我尝试了很多解决方案。我得到的 is:create() 需要 1 个位置参数,但是当我尝试 post 时给出了 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)
在创建函数中,你不应该解包validated_data。所以创建函数定义应该是这样的
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
同样在视图部分,您复制了学校对象的创建。序列化程序已经负责创建学校实例
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)