禁止直接赋值给多对多集合的前端。使用 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)