Django管理界面在内联删除后读取__str __()

时间:2014-12-30 00:54:10

标签: python django django-admin

上下文

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

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()方法吗?

1 个答案:

答案 0 :(得分:0)

  

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

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

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