Как настроить метод обновления для полей 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.