[BUG] Signals do Django estao dando confitos
Fala Galera do Python! Estou implementando um carrinho de compras no meu projeto que tem 3 models nesse problema: produtos, carrinhoitem e carrinho. Estava fazendo um codigo para evitar dois items iguais no carrinho usando signals pre_save. Entretanto, com isso funcionando eu nao to conseguindo mais dar update em produto pois toda vez que faco isso o mesmo nao altera a quantidade. Acredtido que seja por causa da impletacao da verificacao de produto ja existente no carrinho. Voces tem alguma idea de como conseguir evitar a repeticao de produto e ao mesmo tempo permitir o update? Obs: O update por padrao do django esta sendo um "POST carrinhoitems/id/change" e adicionar um novo "POST carrinhositems/add"
validacao
#valida preco e quantidade e coloca no carrinho e usuarios
@receiver(pre_save,sender=CarrinhoItem)
def calcula_preco(sender,**kwargs):
carrinho_item = kwargs['instance']
produto = Produto.objects.get(id=carrinho_item.produto_id.id)
carrinho = Carrinho.objects.get(id=carrinho_item.carrinho.id)
# Check if an item with the same product already exists in the cart
existing_item = CarrinhoItem.objects.filter(
carrinho=carrinho,
produto_id=produto,
user_id=carrinho_item.user_id,
).first()
# #valida repeticao de produto
if existing_item:
add_existente(carrinho_item,existing_item,carrinho,produto)
carrinhoitem
class CarrinhoItem(models.Model):
carrinho = models.ForeignKey(Carrinho,on_delete=models.CASCADE)
user_id = models.ForeignKey(AppUser,on_delete=models.CASCADE,default=None)
produto_id = models.ForeignKey(Produto,on_delete=models.CASCADE)
quantidade = models.IntegerField(default=1)
preco_unitario = models.FloatField(default=0)
preco = models.FloatField(default=0)
total_items=models.IntegerField(default=0)
def __str__(self):
return f"{self.produto_id.nome}"