【问题标题】:How to customise update method for ManyToMany fields in Django Rest Framework如何在 Django Rest Framework 中自定义 ManyToMany 字段的更新方法
【发布时间】:2021-09-11 06:49:48
【问题描述】:

我有几个模型之间存在多对多关系,我需要重写 create 和 update 方法以使 POST 和 PUT 请求在 DRF 中工作。

到目前为止,这是我的代码:

class CreateFolderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Folder
        fields = ("id", "title", "description", "users")

    def create(self, validated_data):
        users = validated_data.pop(
            'users') if 'users' in validated_data else []
        folder = Folder.objects.create(**validated_data)
        folder.users.set(users)
        return folder

此创建方法完美运行。

我尝试为更新方法重新创建相同的逻辑,但它不起作用:

class FolderSerializer(serializers.ModelSerializer):
    documents = DocumentSerializer(many=True, read_only=True)

    class Meta:
        model = Folder
        fields = '__all__'

    def update(self, instance, validated_data):
        users = validated_data.pop('users') if 'users' in validated_data else []
        instance.users.set(users)
        instance.save()
        return instance

当我发送 PUT 请求时,对象根本没有被修改,它被完全删除。

有什么线索吗? 非常感谢。

【问题讨论】:

    标签: django post django-rest-framework many-to-many put


    【解决方案1】:

    不要将documents 设置为read_only

    documents = DocumentSerializer(many=True)
    

    通过调用instance.users.set(users),您替换了先例列表,例如,如果您传递一个空列表,则所有关联用户都将被删除。因此,如果您想保留当前用户的关联,您需要在请求数据中插入他们的主键(对于用户键),否则使用 instance.users.add 而不是 instance.users.set

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 2013-01-13
      • 2015-09-25
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 2021-08-10
      相关资源
      最近更新 更多