繁体   English   中英

IntegrityError UNIQUE约束失败:张贴到Django REST API的OneToOne字段

[英]IntegrityError UNIQUE constraint failed: POSTing to Django REST API, OneToOne Field

我正在使用Angular 7中开发的webapp作为前端发布到后端Django REST API。 基本上,我有两个子类型FacturaAFacturaE的超类型模型Factura ,它们都由OneToOneField相关。

有问题的模型如下所示:

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 ,然后使用添加的键来发布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状态代码,但是无论我使用哪种方法,都仍然会创建对象。 我想知道是什么导致了错误以及如何解决该错误。

编辑:

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

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

因此,代码抛出Unique constraint failed ...

请检查以下步骤:

  • 要确保你是不是要创建另一个FactoraEFactora已经另一个对象FactoraE与同样存在Factora项目。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM