1
resposta

erro no meu projeto Django:" FOREIGN KEY constraint failed" ao tentar alterar o atributo de uma instância na página de admin

Ao tentar alterar uma instância de produto ná página de admin isso está acontecendo.

Os meus Models estão assim:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractUser

class Produto(models.Model):

    OPCOES_CATEGORIA = [
        ("PRATO RASO", "Prato Raso"),
        ("GUARDANAPO", "Guardanapo"),
        ("TALHER", "Talher"),
        ("TACAS", "Tacas"),
        ("TRILHOS DE MESA", "Trilhos de Mesa"),
        ("SOUPLAT", "Souplat"),
        ("JOGO AMERICANO", "Jogo Americano"),
        ("CHA E CAFE", "Cha e Cafe"),
        ("PRATO SOBREMESA", "Prato Sobremesa"),
        ("PORTA GUARDANAPO", "Porta Guardanapo"),
    ]

    OPCOES_ESTILO = [
        ("ELEGANTE", "Elegante"),
        ("TROPICAL", "Tropical"),
        ("FLORIDO", "Florido"),
    ]

    nome = models.CharField(max_length=100)
    categoria = models.CharField(max_length=150, choices=OPCOES_CATEGORIA, default='')
    preco = models.DecimalField(decimal_places=2, max_digits=10)
    quantidade_estoque = models.IntegerField
    imagem = models.ImageField(upload_to="imagens/", blank=True)
    cor = models.CharField(max_length=100)
    estilo = models.CharField(max_length=100, choices=OPCOES_ESTILO, default='')
    estoque = models.IntegerField(null=False, blank=False)
    publicado = models.BooleanField(default=False)

def __str__(self):
    return self.nome

class Cliente(AbstractUser):
    cpf = models.CharField(max_length=11, primary_key=True, default='')
    username = models.CharField(max_length=150, unique=True) 
    nome = models.CharField(max_length=100)
    email = models.EmailField()  
    telefone = models.CharField(max_length=20)  
    data_nascimento = models.DateField(default=timezone.now)  
    senha = models.CharField(max_length=100)


    def __str__(self):
        return self.nome

class Aluguel(models.Model):
    cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE)
    data_aluguel = models.DateField(default=timezone.now)
    data_devolucao = models.DateField()
    preco_total = models.DecimalField(decimal_places=2, max_digits=10)

class ItemAluguel(models.Model):
    aluguel = models.ForeignKey(Aluguel, on_delete=models.CASCADE)
    produto = models.ForeignKey(Produto, on_delete=models.CASCADE)
    quantidade = models.PositiveIntegerField(default=1)
    preco_item = models.DecimalField(decimal_places=2, max_digits=10)

Pensei na possibilidade de que Produto é chave estrangeira de ItemProduto, mas não tem instâncias de objetos ItemProduto na tabela, apenas de produto. Então não sei o que está acontecendo.

Mais detalhes do erro:

IntegrityError at /admin/categorias/produto/11/change/
FOREIGN KEY constraint failed
Request Method:	POST
Request URL:	http://127.0.0.1:8000/admin/categorias/produto/11/change/?_changelist_filters=categoria__exact%3DPRATO%2BRASO
Django Version:	5.0.3
Exception Type:	IntegrityError
Exception Value:	
FOREIGN KEY constraint failed
Exception Location:	C:\Python312\Lib\site-packages\django\db\backends\base\base.py, line 299, in _commit
Raised during:	django.contrib.admin.options.change_view
Python Executable:	C:\Python312\python.exe
Python Version:	3.12.1
Python Path:	
['C:\\Users\\João Lucas\\Desktop\\Eternize_Locacao',
 'C:\\Python312\\python312.zip',
 'C:\\Python312\\DLLs',
 'C:\\Python312\\Lib',
 'C:\\Python312',
1 resposta

Oi João, tudo bem?

A mensagem de erro indica falha de restrição de chave estrangeira. O Django está tentando executar uma operação que viola a integridade referencial no banco de dados.

Notei que em Produto, o campo quantidade_estoque faltou colocar os parenteses. Ele deve ficar assim:

quantidade_estoque = models.IntegerField()

Além disso, peço que se certifique de que os objetos referenciados pelas chaves estrangeiras existam. Por exemplo, se você está alterando um Produto, verifique se não há nenhuma referência inválida em ItemAluguel. Uma dica é verificar se não há erros de digitação ou falta de atualização em casos de renomeação de campos.

Caso o problema persista, você também poderá compartilhar o seu projeto.

De toda forma, fico à disposição.

Abraços e bons estudos!

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