Django - создание нового объекта в сериализаторе, но оставление некоторых параметров из validated_data в стороне
Я использую поле ManyToManyField в своей модели:
class CustomUser(AbstractUser):
...
roles = models.ManyToManyField(Role, blank=True)
А в сериализаторе я хочу создать новый объект CustomUser
class CustomUserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
user = CustomUser.objects.create_user(**validated_data)
Но, конечно, Django жалуется на это: Прямое назначение на прямую сторону множества "многие ко многим" запрещено. Вместо этого используйте roles.set().
Как я могу создать новый объект CustomUser из всех параметров, содержащихся в validated_data, но оставив только 'roles'?
Есть ли элегантный способ сделать это?
Я бы сказал, что нужно вытащить roles, но я думаю, что validated_data immutable в этой ситуации... Так что вместо этого я бы сделал копию и затем вывел ее или просто list comprehension для создания нового dict и использовал его
Copy + Pop
class CustomUserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
create_data = validated_data
create_data.pop('roles')
user = CustomUser.objects.create_user(**create_data)
Понимание списков
class CustomUserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
user = CustomUser.objects.create_user(**{k:v for k,v in validated_data.items() if k != 'roles'})
Ок, значит, вы хотите удалить нужное вам поле из проверенных данных и сохранить его в переменной, которую вы сможете позже получить и выполнить нужное вам действие.
class CustomUserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
# pop returns the item being popped so you can store the returned item in a variable
roles = validated_data.pop("roles")
user = CustomUser.objects.create_user(**validated_data)
# If needed
user.roles.set(roles)
return user