Отношения DRF Serializer Ошибка: Прямое присвоение прямой стороне множества "многие ко многим" запрещено. Вместо этого используйте group.set()

Я создаю api, который будет регистрировать пользователей, связанных с клиентом, а также с организационной группой, но у меня возникают проблемы с регистрацией группы пользователя.

всякий раз, когда я пытаюсь зарегистрироваться, я получаю следующую ошибку:

"Прямое назначение на прямую сторону множества "многие-ко-многим" запрещено. Вместо этого используйте group.set()."

.

Помогите мне понять, что я делаю неправильно?

my models.py

class Cliente(models.Model):
    nome = models.CharField(max_length=100, unique=True, null=True)
    documento = models.CharField(max_length=30, blank=True, default='00.000.000/0001-00')
    logo = models.CharField(max_length=255, blank=True, null=True)
    data_de_criacao = models.DateField(default=date.today)
    cliente_ativo = models.BooleanField(default=True)
    background_img = models.CharField(max_length=255, blank=True, null=True)
    cor_primaria = models.CharField(max_length=10, blank=True, null=True)
    cor_secundaria = models.CharField(max_length=10, blank=True, null=True)


    def __str__(self):
        return self.nome

class GrupoOrganizacional(models.Model):
    id_grupo = models.BigAutoField(primary_key=True, unique=True) 
    nome_grupo = models.CharField(max_length=100, blank=False, null=False)
    cliente = models.ForeignKey(Cliente, blank=True, null=True ,on_delete=models.CASCADE)

    def __str__(self):
        return self.nome_grupo
    
class Usuario(AbstractUser):
   
    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    cliente = models.ForeignKey(Cliente, blank=True, null=True ,on_delete=models.CASCADE)
    first_name = models.CharField(max_length=100, blank=False, null=False)
    last_name = models.CharField(max_length=100, blank=False, null=False)
    username = models.CharField(max_length=50, blank=True, null=True)
    email = models.EmailField(max_length=100, blank=False, null=False, unique=True, error_messages={'unique': "O email cadastrado já existe."})
    password = models.CharField(max_length=100, blank=False, null=False)
    usuario_ativo = models.BooleanField(default=True)
    grupo = models.ManyToManyField(GrupoOrganizacional, related_name='grupos')
    
    is_staff = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)

    def __str__(self):
        return "%s (%s)" %(self.first_name, self.cliente)

my views.py

class GruposViewSet(viewsets.ModelViewSet):
    ''' Lista todos os grupos cadastrados '''
    queryset = GrupoOrganizacional.objects.all()
    serializer_class = ListaGruposSerializer

    permission_classes = [IsAuthenticated, IsAdminUser]
    
class UsuariosViewSet(viewsets.ModelViewSet):
    ''' Lista todos os usuarios cadastrados'''
    queryset = Usuario.objects.all()
    serializer_class = UsuarioSerializer

    permission_classes = [IsAuthenticated, IsAdminUser]
    

my serializers.py

class GruposDoUsuarioSerializer(PrimaryKeyRelatedField ,serializers.ModelSerializer):
    '''Serializer para listar todos os grupos organizacionais cadastrados'''
    #grupo_id = serializers.PrimaryKeyRelatedField( many=True, read_only=True )

    class Meta:
        model = GrupoOrganizacional
        fields = ['id_grupo']


class UsuarioSerializer(serializers.ModelSerializer):
    '''Serializer para listar, criar e atualizar os usuarios'''
    
    grupo = GruposDoUsuarioSerializer(many=True, queryset=GrupoOrganizacional.objects.all()) # Quando usado, envia uma lista não suportada

    password = serializers.CharField(
        style={'input_type': 'password'},
        write_only=True,
        label="Senha"
    )

    password_confirm = serializers.CharField(
        style={'input_type': 'password'},
        write_only=True,
        label="Confirme a senha"
    )

    is_staff = serializers.BooleanField(
        label="Membro da Equipe",
        help_text="Indica que usuário consegue acessar o site de administração."
    )

    is_superuser = serializers.BooleanField(
        label="SuperUsuário",
        help_text="Indica que este usuário tem todas as permissões sem atribuí-las explicitamente."
    )

    class Meta:
        model = Usuario
        fields = ('id','cliente', 'first_name', 'last_name', 'username', 'email', 
        'password', 'password_confirm', 'usuario_ativo', 'grupo', 'is_staff', 'is_superuser')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        '''Permite caradastrar e atualizar contas'''
        usuario = Usuario.objects.create(**validated_data)
        grupo_data = validated_data.get('id_grupo')
        password = self.validated_data.get('password')
        password_confirm = self.validated_data.get('password_confirm')

        for grupo_data in grupo_data:
            GrupoOrganizacional.objects.create(usuario=usuario, **grupo_data)
        if password != password_confirm:
            raise serializers.ValidationError({'password': 'As senhas não são iguais.'})
        
        #usuario.grupo.set(usuario)
        #usuario.set_grupo(grupo)

        usuario.set_password(password)
        usuario.save()
        
        
        return usuario

У меня не было проблем с регистрацией клиентов, только с регистрацией групп.

Я уже пытался изменить свой код, основываясь на документации DRF и некоторых сомнениях отсюда, я понял, что проблема, вероятно, в serializer.py, но я все еще не могу понять, что вызывает ошибку

несколько ссылок на то, что я пытался сделать:

В какой-то момент группы перестали отображаться на странице api, поэтому я использовал эту ссылку, чтобы решить проблему:

Попробуйте что-нибудь вроде:

grupo_organizacional_list = []
for grupo_data in grupo_data:
    grupo_organizacional_list.append(GrupoOrganizacional(**grupo_data))

grupo_organizacional_list = GrupoOrganizacional.bulk_create(grupo_organizacional_list)
usario.grupo.set(*grupo_organizacional_list)
Вернуться на верх