【问题标题】:Direct assignment to the forward side of a many-to-many set is prohibited. Use students_that_completed.set() instead禁止直接分配到多对多集合的前端。改用 student_that_completed.set()
【发布时间】:2021-07-01 23:09:06
【问题描述】:

当我尝试创建新的“分配”/模型实例时会发生此错误。 ofc 这在 django 管理面板中工作得非常好,但是当我对 django rest framework browsable api 做同样的事情时,它不起作用。

这是我的“分配”序列化程序类(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)

【问题讨论】:

    标签: python django postgresql serialization django-rest-framework


    【解决方案1】:

    您不能创建对象和 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)
    

    【讨论】:

    • tnx for you're time,这条线不适合我,我应该将什么导入我的项目? @transaction.atomic
    • from django.db import transaction
    • 收到此错误:create()` must be implemented.
    • 啊,是的,你应该使用ModelSerializer。您可能需要调整fields。立即尝试。
    • 是的,它适用于 ModelSerializer。但是我不需要所有这些东西,比如字段、创建、更新......我只需要一个 Meta 就可以了
    猜你喜欢
    • 2018-10-05
    • 2020-03-21
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多