Как настроить метод обновления для полей ManyToMany в Django Rest Framework

У меня есть несколько моделей с отношениями ManyToMany между ними, и мне нужно переопределить метод 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

Этот метод создания работает отлично.

Я попытался воссоздать ту же логику для метода update, но это не работает:

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 запрос, объект вообще не изменяется, он удаляется.

Есть какая-нибудь подсказка? Большое спасибо.

Не устанавливайте documents в качестве read_only:

documents = DocumentSerializer(many=True)

Вызывая instance.users.set(users), вы заменяете прецедентный список, например, если вы передадите пустой список, все ассоциированные пользователи будут удалены. Поэтому если вы хотите оставить текущих пользователей связанными, вам нужно вставить их первичные ключи в данные запроса (для ключа users), в противном случае используйте instance.users.add вместо instance.users.set.

Вернуться на верх