我发布到一个后端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
,如下所示:
在Django管理中手动添加一个Factura
,然后再添加一个FacturaE
,不会产生任何错误,但是通过API或我的前端应用程序手动执行此操作会导致以下错误。在
django.db.utils.IntegrityError: UNIQUE constraint failed: CasadelaAPI_facturae.factura_id
。在
尽管有这个错误,尽管返回了500个HTTP状态代码,但是不管我使用什么方法,对象仍然是创建的。我想知道是什么导致了这个错误,以及如何修复它。在
解决了,super
在save()
方法重写中被调用两次,后端试图保存facture对象两次,第二个super().save(*args, **kwargs)
产生错误
错误的原因是您违反了
OneOnOne
属性,方法是使用一个分配给它的现有Factora
对象创建一个FactoraE
属性。在所以代码抛出
Unique constraint failed ...
。在请检查以下步骤:
请确保您没有试图用一个
Factora
对象创建另一个FactoraE
对象,该对象已经存在另一个Factora
项目。可能在您的UI代码中,在服务(这里没有提供)中,您没有正确地传递
Factora.id
,因此它与以前的请求相同,导致了此错误。更新 不建议调用
super
两次,这可能会导致问题。在相关问题 更多 >
编程相关推荐