Django:RecursionError:超出最大递归深度

问题描述 投票:0回答:1

我在保存某个模型时在django中收到运行时错误。

我想用两个实例保存模型

所以我做了以下事情:


class Journal(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True
    )
    company = models.ForeignKey(
        company, on_delete=models.CASCADE, null=True, blank=True, related_name="Companyname"
    )
    counter = models.IntegerField(blank=True, null=True)
    urlhash = models.CharField(max_length=100, null=True, blank=True, unique=True)
    date = models.DateField(default=datetime.date.today)
    voucher_id = models.PositiveIntegerField(blank=True, null=True)
    voucher_type = models.CharField(max_length=100, blank=True)
    by = models.ForeignKey(ledger1, on_delete=models.CASCADE, related_name="Debitledgers")
    to = models.ForeignKey(ledger1, on_delete=models.CASCADE, related_name="Creditledgers")
    debit = models.DecimalField(max_digits=10, decimal_places=2, null=True)
    credit = models.DecimalField(max_digits=10, decimal_places=2, null=True)
    narration = models.TextField(blank=True)


@receiver(pre_save, sender=Journal)
def pl_journal(sender, instance, *args, **kwargs):
    if (
        instance.debit != None
        or instance.credit != None
        or instance.by.group1_Name.group_Name == "Indirect Expense"
    ):
        Journal.objects.update_or_create(
            user=instance.user,
            company=instance.company,
            date=instance.date,
            voucher_id=instance.id,
            voucher_type="Journal",
            by=instance.by,
            to=ledger1.objects.filter(
                user=instance.user, company=instance.company, name__icontains="Profit & Loss A/c"
            ).first(),
            debit=instance.debit,
            dredit=instance.credit,
        )

问题在于我信号中的以下代码行:

to=ledger1.objects.filter(user=instance.user,company=instance.company,name__icontains='Profit & Loss A/c').first()

任何人都知道为什么会发生这种错误?

有什么办法可以解决吗?

谢谢

django django-models django-signals
1个回答
0
投票

你有一个pre_save信号接收器的模型,最终管理相同的模型,所以你得到这样的东西:

  1. journal.save()被称为
  2. pl_journal(sender=Journal, instance=journal)被称为
  3. Journal.objects.update_or_create(...)(可能)被称为
  4. .update_or_create()在更新或创建的Journal实例上调用.save(),因此请返回步骤1。

因此,您发生了无限递归,Python限制了最大递归深度并引发了异常。

© www.soinside.com 2019 - 2024. All rights reserved.