3
respostas

Erro ao fazer a migração

Estou com um problema, e vi que um aluno também teve o mesmo problema que eu, porém a solução dele não resolveu o meu problema, será que alguém poderia me ajudar por gentileza?

PS C:\Users\alexandre\Desktop\aplicacao> python manage.py makemigrations
Migrations for 'receitas':
  receitas\migrations\0005_alter_receita_pessoa.py
    - Alter field pessoa on receita
PS C:\Users\alexandre\Desktop\aplicacao> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, pessoas, receitas, sessions
Running migrations:
  Applying receitas.0005_alter_receita_pessoa...Traceback (most recent call last):
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.ForeignKeyViolation: insert or update on table "receitas_receita" violates foreign key constraint "receitas_receita_pessoa_id_a8898e91_fk_auth_user_id"
DETAIL:  Key (pessoa_id)=(2) is not present in table "auth_user".


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\alexandre\Desktop\aplicacao\manage.py", line 22, in <module>
    main()
  File "C:\Users\alexandre\Desktop\aplicacao\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\alexandre\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "C:\Users\alexandre\lib\site-packages\django\core\management\__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\alexandre\lib\site-packages\django\core\management\base.py", line 414, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\alexandre\lib\site-packages\django\core\management\base.py", line 460, in execute
    output = self.handle(*args, **options)
  File "C:\Users\alexandre\lib\site-packages\django\core\management\base.py", line 98, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\alexandre\lib\site-packages\django\core\management\commands\migrate.py", line 290, in handle
  File "C:\Users\alexandre\lib\site-packages\django\db\migrations\executor.py", line 131, in migrate
    state = self._migrate_all_forwards(
  File "C:\Users\alexandre\lib\site-packages\django\db\migrations\executor.py", line 163, in _migrate_all_forwards     
    state = self.apply_migration(
  File "C:\Users\alexandre\lib\site-packages\django\db\migrations\executor.py", line 248, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\Users\alexandre\lib\site-packages\django\db\migrations\migration.py", line 131, in apply
    operation.database_forwards(
  File "C:\Users\alexandre\lib\site-packages\django\db\migrations\operations\fields.py", line 235, in database_forwards    schema_editor.alter_field(from_model, from_field, to_field)
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\base\schema.py", line 747, in alter_field
    self._alter_field(
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\postgresql\schema.py", line 231, in _alter_field       
    super()._alter_field(
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\base\schema.py", line 1054, in _alter_field
    self.execute(
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\base\schema.py", line 192, in execute
    cursor.execute(sql, params)
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\utils.py", line 103, in execute
    return super().execute(sql, params)
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\utils.py", line 67, in execute
    return self._execute_with_wrappers(
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\utils.py", line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\alexandre\lib\site-packages\django\db\utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\alexandre\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: insert or update on table "receitas_receita" violates foreign key constraint "receitas_receita_pessoa_id_a8898e91_fk_auth_user_id"
DETAIL:  Key (pessoa_id)=(2) is not present in table "auth_user".
3 respostas

o models

from django.db import models
from datetime import datetime
from django.contrib.auth.models import User

class Receita(models.Model):
    pessoa = models.ForeignKey(User, on_delete=models.CASCADE)
    nome_receita = models.CharField(max_length=200)
    ingredientes = models.TextField()
    modo_preparo = models.TextField()
    tempo_preparo = models.IntegerField()
    rendimento = models.CharField(max_length=100)
    categoria = models.CharField(max_length=100)
    data_receita = models.DateTimeField(default=datetime.now, blank=True)
    foto_receita = models.ImageField(upload_to='fotos/%d/%m/%Y/', blank=True)
    publicada = models.BooleanField(default=False)

    # SERVE PARA QUE O NOME DA RECEITA SEMPRE APAREÇA CERTO E NÃO COMO OBJECT(...)
    def __str__(self):
        return self.nome_receita

Outra dúvida que não ficou claro na aula também, por qual motivo teve que fazer essa alteração da pessoa para o user? não consegui compreender bem essa mudança.

Olá Alexandre, tudo bem com você?

Peço desculpas pela demora no retorno.

Gostaria de saber se o erro ainda é apresentado.

A troca do uso do app Pessoas para o uso do modelo do Django (User) tem como objetivo trabalhar com o modelo de usuário pré definido pelo Django onde esse usuário possui os campos predefinidos, sem a necessidade de criação de um modelo do zero, diferente do nosso app Pessoas que possui apenas dois campos, nome e e-mail o modelo Django User, possui os principais campos necessários para a criação de um cadastro de usuário.

Esse erro pode estar relacionado com a quantidade de pessoas do app Pessoas cadastradas no painel administrador do Django, caso a quantidade de pessoas (app Pessoas) criadas seja diferente da quantidade de usuários criados no modelo do Django (User), será apresentado erro no momento da migração.

Conforme o erro apresentado em seu projeto existem 2 Pessoas cadastradas, não sendo encontrado uma referência para a segunda pessoa ((pessoa_id)=(2)) na tabela de User (auth_user). Para solucionar, recomendo que crie um novo cadastro de usuário usando o formulário de cadastro, assim teremos uma segunda referência, podendo acontecer a migração.

Para isso, basta seguir os passos abaixo.

  • Inicie o servidor, e acesse a página de cadastro de usuário, cadastre um novo usuário.

  • Após realizar o cadastro, usando o terminal aberto no ambiente virtual do projeto, crie uma nova migração com o comando a seguir.

      python manage.py makemigrations
    
  • Nesse momento podemos realizar a migração, com o comando abaixo.

      python manage.py migrate
    

Peço que teste os passos que foram propostos acima, caso o erro persista, encontro-me à disposição.

Abraços e bons estudos.

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