Отношения 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)