IntegrityError UNIQUE 约束失败:POST to Django REST API, OneToOne



我正在使用Angular 7开发的Web应用程序作为前端发布到后端Django REST API。基本上我有一个超类型模型Factura两个子类型,FacturaAFacturaE,它们都由一对一字段相关。

有问题的模型如下所示:

class Factura(models.Model):
fecha = models.DateField()
contrato = models.ForeignKey(Contrato, related_name='facturas', on_delete=models.CASCADE)
pagado = models.BooleanField(default=False)
def __str__(self):
return 'Factura %s: %s - %s' % (self.id, self.fecha, self.contrato)
class FacturaE(models.Model):
factura = models.OneToOneField(
Factura,
on_delete=models.CASCADE,
primary_key=True,
)
kwh = models.DecimalField(max_digits=100, decimal_places=2)
monto = models.DecimalField(max_digits=100, decimal_places=2, null=True, blank=True)
def save(self, *args, **kwargs):
#calcula el monto
if self._state.adding is True:
self.monto = float(self.kwh) * 4.0588
super().save(*args, **kwargs)
super().save(*args, **kwargs)
class Meta:
verbose_name = 'Factura Electrica'
verbose_name_plural = 'Facturas Electricas'
def __str__(self):
return 'Electricidad: %s - %s' % (self.factura, self.monto)

在我的前端应用程序中,我首先通过创建一个超类型对象Factura来 POST,然后使用添加的键发布如下所示的FacturaE

addFactura(fecha: Date, kwh: number, monto: number) {
this.factura = new Factura(0, fecha, false, this.id);
this.pagoService.addFactura(this.factura).subscribe(f => {
this.facturaElectrica = new FacturaEAdd(f.id, kwh, monto);
this.pagoService.addFacturaElectrica(this.facturaElectrica).subscribe();
});
}

在 Django Admin 中手动添加一个Factura后跟一个FacturaE不会产生错误,但是通过 API 或通过我的前端应用程序手动执行此操作会给我以下错误。

django.db.utils.IntegrityError: UNIQUE constraint failed: CasadelaAPI_facturae.factura_id.

尽管存在此错误,并且尽管返回了 500 HTTP 状态代码,但无论我使用哪种方法,仍会创建对象。我想知道导致错误的原因以及如何解决它。

编辑:

已解决,super方法覆盖中被调用两次save()后端尝试保存 FacturaE 对象两次,第二个super().save(*args, **kwargs)产生错误

该错误是因为您通过创建分配了现有Factora对象的FactoraE来违反OneOnOne属性。

所以代码抛出Unique constraint failed ....

请检查以下步骤:

  • 确保您没有尝试使用已存在具有相同Factora项的Factora对象创建另一个FactoraEFactoraE

  • 也许在您的 UI 代码中,在服务中(此处未提供)您没有正确传递Factora.id,因此它与以前的请求相同,导致此错误。

不建议呼叫super更新两次,这可能会导致问题。

最新更新