禁止直接赋值给多对多集合的前端。使用 students_that_completed.set() 代替
Direct assignment to the forward side of a many-to-many set is prohibited. Use students_that_completed.set() instead
当我尝试创建新的“分配”/模型实例时发生此错误。
ofc 这在 django 管理面板中工作得很好但是当我对 django rest framework browsable api 做同样的事情时它不起作用。
这是我的“作业”序列化程序 class (AssignmentSerializer):
class AssignmentSerializer(serializers.Serializer):
title = serializers.CharField(max_length=50)
body = serializers.CharField(max_length=1000)
attachment = serializers.FileField(max_length=100)
class_name = serializers.CharField(max_length=50)
students_that_completed = serializers.PrimaryKeyRelatedField(queryset=Student.objects.all(), many=True)
owner = serializers.PrimaryKeyRelatedField(queryset=Teacher.objects.all())
def create(self, validated_data):
"""
Create and return an "Assignment" instance.
"""
print(validated_data)
return Assignment.objects.create(**validated_data)
您不能创建对象和 many=True
的东西。你需要自己处理。
尝试这样的事情。
class AssignmentSerializer(serializers.ModelSerializer):
title = serializers.CharField(max_length=50)
body = serializers.CharField(max_length=1000)
attachment = serializers.FileField(max_length=100)
class_name = serializers.CharField(max_length=50)
students_that_completed = serializers.PrimaryKeyRelatedField(queryset=Student.objects.all(), many=True)
owner = serializers.PrimaryKeyRelatedField(queryset=Teacher.objects.all())
class Meta:
model = Assignment
fields = ['title', 'body', 'attachment', 'class_name', 'students_that_completed', 'owner']
@transaction.atomic
def create(self, validated_data):
students = validated_data.pop('students_that_completed', [])
obj = super().create(validated_data)
if students:
obj.students_that_completed.set(students)
return obj
我不知道你的模型看起来如何,所以你可能需要调整这条线。
obj.students_that_completed.set(students)
当我尝试创建新的“分配”/模型实例时发生此错误。 ofc 这在 django 管理面板中工作得很好但是当我对 django rest framework browsable api 做同样的事情时它不起作用。
这是我的“作业”序列化程序 class (AssignmentSerializer):
class AssignmentSerializer(serializers.Serializer):
title = serializers.CharField(max_length=50)
body = serializers.CharField(max_length=1000)
attachment = serializers.FileField(max_length=100)
class_name = serializers.CharField(max_length=50)
students_that_completed = serializers.PrimaryKeyRelatedField(queryset=Student.objects.all(), many=True)
owner = serializers.PrimaryKeyRelatedField(queryset=Teacher.objects.all())
def create(self, validated_data):
"""
Create and return an "Assignment" instance.
"""
print(validated_data)
return Assignment.objects.create(**validated_data)
您不能创建对象和 many=True
的东西。你需要自己处理。
尝试这样的事情。
class AssignmentSerializer(serializers.ModelSerializer):
title = serializers.CharField(max_length=50)
body = serializers.CharField(max_length=1000)
attachment = serializers.FileField(max_length=100)
class_name = serializers.CharField(max_length=50)
students_that_completed = serializers.PrimaryKeyRelatedField(queryset=Student.objects.all(), many=True)
owner = serializers.PrimaryKeyRelatedField(queryset=Teacher.objects.all())
class Meta:
model = Assignment
fields = ['title', 'body', 'attachment', 'class_name', 'students_that_completed', 'owner']
@transaction.atomic
def create(self, validated_data):
students = validated_data.pop('students_that_completed', [])
obj = super().create(validated_data)
if students:
obj.students_that_completed.set(students)
return obj
我不知道你的模型看起来如何,所以你可能需要调整这条线。
obj.students_that_completed.set(students)