【问题标题】:Help creating model for Django app帮助为 Django 应用创建模型
【发布时间】:2011-01-07 10:09:36
【问题描述】:

我正在尝试使用 Django 制作一个托儿管理应用,但我的付款代码有一些问题。

每个孩子每年必须每月支付 10 次。这些付款有一些特殊性:

  • 有些孩子可能会根据父母的经济状况支付不同的金额。

  • 付款金额可能会在一年内发生变化。

  • 可以在不同的机会支付款项。

  • 工作坊和食物被添加到付款的总价值中(它们是可选的)。

我在为这个应用建模时遇到了问题。我正在考虑创建一个儿童模型和一个支付模型:

class Kid(models.Model):
    food = models.BooleanField()
    workshop = models.BooleanField()
    special_price = models.DecimalField(blank=True)

class Payment(models.Model):
    kid = models.ForeignKey(Kid)
    date = models.DateField() 
    amount = models.DecimalField()`

假设我想知道在给定日期,孩子(父母)必须支付多少钱。我不知道如何解决不断变化的价值观问题(食物和车间的价值观也可能在一年中发生变化)。

希望你能理解我,谢谢。 mF.

【问题讨论】:

  • 还有人在看标题的时候WTF吗?
  • 你应该考虑把这个问题的标题改成更具体的东西,比如“需要帮助为 Django 应用程序创建模型”,并且可能添加一个面向对象的标签。乍一看,这个问题看起来像垃圾邮件。 :-)
  • 是的......标题需要澄清(我会,但我显然无法编辑/标记这篇文章)。
  • 我认为这不是一个 django 问题,而更像是一个“数据建模”问题。你如何构造数据库表,而不是如何让 Django 工作。我会用 'sql' 或 'database' 重新标记这个问题,让更多人看到它。
  • 所以您需要一个规则,将车间和食物重新计算为金钱?只要你发明(或在某个地方找到)这样的规则,这个问题就会成为一项编程任务。

标签: python django models


【解决方案1】:

无论您的最终模型如何,假设您将保留 Payment 模型,您可以向其中添加两个字段:

    payment_date = model.DateField()
    already_paid = models.BooleanField()

然后,要获得逾期付款,您将能够进行查询:

    Payment.objects.filter(payment_date__lte=datetime.date.today(), already_paid=False)

拥有这些 Payment 对象,您将能够计算出确切的金额。

【讨论】:

    【解决方案2】:

    我会根据孩子的属性计算付款,因此通过更新孩子,付款会发生变化。在付款之前,付款不会成为数据库中的条目,每次用户请求时都会计算付款。

    class Child(object):
       def __init__(self,income,paydate,meals=False,workshops=False):
          self.income = income
          self.paydate = paydate
          ...
    

    我还会有一个定价规则模型,结合子对象可以为您提供付款金额。再次更新 PricingRules 会改变付款方式。

    class PricingRules(object):
       def __init__(self,income_scale,paydate,meal_price,workshop_price,num_payments):
          ...
    

    我会避免为每个孩子设置一个 PricingRules 对象。然后会有 Payment 对象

    class Payment(object):
       def __init__(self,amount,date_paid):
          ...
    

    我已经避免显示任何特定于正在使用的 ORM 的代码,我相信设计应该独立存在,并且我还希望保留在没有 ORM 的情况下使用对象的可能性。使用构造函数也是我的个人风格,我喜欢知道当一个对象从一个类创建时,它会处于定义良好且稳定的状态。在没有关于业务逻辑的更多细节的情况下,除了这一点之外,我还有更多的问题要回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多