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
Вернуться на верх