IntegrityError CHECK constraint failed on Django
вот моя ошибка:
IntegrityError at /caja_chica/comprobantes/9/editar/
CHECK constraint failed: caja_chica_cajachica
Request Method: POST
Request URL: http://127.0.0.1:8000/caja_chica/comprobantes/9/editar/
Django Version: 3.2.5
Exception Type: IntegrityError
Exception Value:
CHECK constraint failed: caja_chica_cajachica
Проблема возникает на моей модели, когда я пытаюсь сохранить объект Comprobante перед выполнением операции. Вот моя модель Comprobante:
class Comprobante(models.Model):
TIPO_A = 1
TIPO_B = 2
TIPO_C = 3
TIPO_T = 4
TIPO_X = 5
TIPO_CHOICES = (
(TIPO_A, 'A'),
(TIPO_B, 'B'),
(TIPO_C, 'C'),
(TIPO_T, 'T'),
(TIPO_X, 'X'),
)
caja_chica = models.ForeignKey(CajaChica, on_delete=models.PROTECT)
lote = models.ForeignKey(Lote, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='lote_comprobantes')
numero = models.CharField(max_length=13)
tipo = models.PositiveSmallIntegerField(choices=TIPO_CHOICES, default=TIPO_T)
ente = models.ForeignKey(Ente, on_delete=models.PROTECT)
fecha = models.DateField()
partida_presupuestaria = models.ForeignKey(PartidaPresupuestaria, on_delete=models.PROTECT)
detalle = models.CharField(max_length=100)
importe = models.DecimalField(max_digits=7, decimal_places=2)
history = HistoricalRecords()
def __str__(self):
return self.numero
def save(self, *args, **kwargs):
super(Comprobante, self).save(*args, **kwargs)
self.caja_chica.disponible -= self.importe
self.caja_chica.save()
def get_absolute_url(self):
"""
Devuelve la url para acceder a una instancia particular de Comprobante.
"""
return reverse('caja_chica:comprobante_update', args=[str(self.id)])
вот функция, которая сломала мою модель:
def save(self, *args, **kwargs):
super(Comprobante, self).save(*args, **kwargs)
self.caja_chica.disponible -= self.importe
self.caja_chica.save()
а это моя модель CajaChica:
class CajaChica(models.Model):
FUENTE_11 = 11
FUENTE_12 = 12
FUENTE_13 = 13
FUENTE_CHOICES = (
(FUENTE_11, FUENTE_11),
(FUENTE_12, FUENTE_12),
(FUENTE_13, FUENTE_13),
)
numero = models.PositiveSmallIntegerField()
nombre = models.CharField(max_length=100, unique=True)
limite = models.PositiveIntegerField(help_text='Cantidad de dinero máxima asignada para gastos')
disponible = models.PositiveIntegerField(help_text='Dinero disponible para gastos')
fuente = models.PositiveSmallIntegerField(choices=FUENTE_CHOICES, default=FUENTE_11)
actividad = models.ForeignKey(Actividad, on_delete=models.DO_NOTHING)
ubicacion = models.ForeignKey(UbicacionGeografica, on_delete=models.PROTECT)
responsable = models.OneToOneField(Responsable, on_delete=models.PROTECT, related_name='caja_chica')
subresponsable = models.OneToOneField(Responsable, on_delete=models.DO_NOTHING, null=True, blank=True)
history = HistoricalRecords()
class Meta:
verbose_name_plural = 'Cajas Chicas'
def __str__(self):
return self.nombre
при попытке сохранить объект Comprobante выдает ошибку
IntegrityError at /caja_chica/comprobantes/9/editar/
CHECK constraint failed: caja_chica_cajachica
Request Method: POST
Request URL: http://127.0.0.1:8000/caja_chica/comprobantes/9/editar/
Django Version: 3.2.5
Exception Type: IntegrityError
Exception Value:
CHECK constraint failed: caja_chica_cajachica
Я доказал, что нужно закомментировать эту функцию, чтобы узнать, нарушает она мой код или нет, и когда я это сделал, приложение заработало отлично, но мне нужно, чтобы она выполняла эту операцию с объектом caja_chica. Я не знаю, как решить эту проблему, я не понимаю, где я должен работать над ней.