1
resposta

Autenticação básica de usuários e administradores

Estou criando uma API com DjandoRest para atutenticar logins de usuários em um site, então vi que no curso o Gui mostrou como fazer a autenticação com superUsuarios, outra pessoa teve uma dúvida parecida aqui mesmo no forum encontrei uma resposta da Nadia explicando como fazer para criar este usuário.

Segui o passo a passo e consegui realizar o cadastro de usuários, e tudo correu bem(pois já havia criado um super usuário). Acontece, que após isso, precisei trocar o banco de dados (pois estava rodando local e precisaria que estivesse em um ambiente de produção), mas, ao fazer isso, tive problemas para criar novos superUsuários.

O que fiz de diferente? Tenho um app chamado "Clientes" e nele crio o model do cliente e do usuário, acontece que o usuário está relacionado ao cliente recebendo ele através de um ForeignKey (para que um usuário nunca seja cadastrado sem nenhum cliente por padrão e para facilitar a criação deste relacionamento no momento do cadastro)

O erro acontece justamente por isso:

    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: null value in column "cliente_id" of relation "clientes_usuario" violates not-null constraint
DETAIL:  Failing row contains (3, null, rafael, , , t, 2022-08-11 14:18:07.060349+00, , pbkdf2_sha256$390000$oxjewIlY3fh8w7spi7W4ZM$3idgsD69eyzLiNZ+L0xf..., rafael@email.com.br, t, t, null).

PS:(O 'id 3' foi por causa que já tentei outras 2x criar este usuário rsrss)

A criação de superUsuarios não consegue ser realizada por causa que não há clientes para superUsuarios.

  • Mais alguém já teve esse tipo de problema?
  • Como faria para criar superUsuarios não relacionados aos clientes ou como faria para criar um cliente sem precisar acessar o DjangoAdmin?
1 resposta

Olá Rafael, tudo bem com você?

Peço desculpas pela demora no retorno.

O erro que você está recebendo é devido à restrição de chave estrangeira que você criou no modelo de usuário, que exige que cada usuário esteja associado a um cliente. Isso significa que, para criar um novo superusuário, você precisará primeiro criar um cliente associado a esse usuário.

Uma opção para resolver isso é criar um cliente de forma programática usando o shell do Django. Para fazer isso, siga os seguintes passos:

  • Abra um terminal e navegue até a pasta raiz do seu projeto Django.

  • Digite python manage.py shell para abrir o shell do Django.

  • Importe os modelos necessários digitando:

      from clientes.models import Cliente
      from django.contrib.auth.models import User
  • Crie um novo cliente digitando:

      cliente = Cliente.objects.create(nome='Nome do Cliente')
  • Crie um novo superusuário associado a esse cliente digitando:

      superuser = User.objects.create_superuser(username='seu_nome_de_usuario', email='seu_email@exemplo.com', password='sua_senha')
      superuser.cliente = cliente
      superuser.save()
    
  • Isso criará um novo cliente com o nome "Nome do Cliente" e um novo superusuário com as informações fornecidas. O superusuário será associado ao cliente recém-criado.

Uma segunda alternativa será tornar o campo cliente opcional, permitindo que o usuário possa ser criado sem estar associado a um cliente. Para fazer isso, basta adicionar o parâmetronull=True ao campo cliente no seu modelo de usuário:

class Usuario(models.Model):
    cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, null=True)
    # outros campos do modelo

Lembre-se de executar python manage.py makemigrations seguido de python manage.py migrate para atualizar o banco de dados. Depois disso, você poderá criar usuários sem associá-los a um cliente.

Todavia, vale ressaltar que como é um assunto externo ao curso e que não tenho acesso ao cenário completo do projeto incluindo a estrutura inicial do seu banco de dados, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema.

Espero ter ajudado. Continue mergulhando em conhecimento!

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!