【问题标题】:Django admin interface reading __str__() after inline delete内联删除后 Django 管理界面读取 __str__()
【发布时间】:2015-02-26 04:33:58
【问题描述】:

上下文:

我刚刚开始使用 Django。为了熟悉它,我正在编写一个网络应用程序来跟踪家庭中的账单。每张账单都有每个欠款人的相关账单部分。欠款的计算方法是账单总额除以部分总数(即涉及的人数)。见下文:

class Bill(models.Model):
  description = models.CharField(max_length=100)
  amount = models.DecimalField(max_digits=9, decimal_places=2)
  paid_by = models.ForeignKey(Person)

  def __str__(self):
    return self.description

class BillPortion(models.Model):
  bill = models.ForeignKey(Bill, related_name='portions')
  person = models.ForeignKey(Person, related_name='bill_portions')

  @property
  def amount(self):
    return self.bill.amount / self.bill.portions.count()

  def __str__(self):
    return str(self.person) + ' owes ' + str(self.bill.paid_by) + \
           ' $' + str(self.amount) + ' for ' + str(self.bill)

问题:

我的应用程序的管理界面有账单,其中还包括使用 admin.StackedInline 内联的相关 BillPortion 对象。当我删除连接到特定账单的最后一个 BillPortion 时,BillPortion 的 amount() 属性中出现 DivisonByZero 错误。 BillPortion 的__str__() 方法正在读取该属性。

似乎在从数据库中删除 BillPortion 对象后,它正在尝试读取该部分的 __str__ 方法。但由于它不再存在于数据库中,str(self.amount) 导致 DivisionByZero 错误。

为什么管理界面会尝试读取我刚刚删除的对象的__str__() 方法?我应该边缘化amount() 方法吗?

【问题讨论】:

  • 您需要一个名为 amount 的辅助方法中的 if 条件。这就是当计数为零时进行除法的地方。

标签: python django django-admin


【解决方案1】:

为什么管理界面会尝试读取我刚刚删除的对象的 str() 方法?我应该对 amount() 方法进行边缘处理吗?

我的问题是因为它使用该属性来显示信息(消息包)。

您可以尝试覆盖__str__,然后检查 self.amount 是否存在/是否正确返回,如果不正确,则返回空字符串或其他可读消息。

【讨论】:

  • 我认为这是最优雅的方式。我最终在 BillPortion 的__str__ 中发现了异常。谢谢!