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