IntegrityError唯一约束失败:发布到Django REST API,OneToOne字段

2024-10-06 13:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我发布到一个后端Django restapi使用angular7开发的webapp作为前端。基本上,我有一个超类型模型Factura,这两个子类型,FacturaA和{},它们都是由一个单一字段关联的。在

相关模型如下所示:

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,如下所示:

^{pr2}$

在Django管理中手动添加一个Factura,然后再添加一个FacturaE,不会产生任何错误,但是通过API或我的前端应用程序手动执行此操作会导致以下错误。在

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

尽管有这个错误,尽管返回了500个HTTP状态代码,但是不管我使用什么方法,对象仍然是创建的。我想知道是什么导致了这个错误,以及如何修复它。在

编辑:

解决了,supersave()方法重写中被调用两次,后端试图保存facture对象两次,第二个super().save(*args, **kwargs)产生错误


Tags: nameselftrue类型modelssavedef错误
1条回答
网友
1楼 · 发布于 2024-10-06 13:17:32

错误的原因是您违反了OneOnOne属性,方法是使用一个分配给它的现有Factora对象创建一个FactoraE属性。在

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

请检查以下步骤:

  • 请确保您没有试图用一个Factora对象创建另一个FactoraE对象,该对象已经存在另一个Factora项目。

  • 可能在您的UI代码中,在服务(这里没有提供)中,您没有正确地传递Factora.id,因此它与以前的请求相同,导致了此错误。

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

相关问题 更多 >