什么样的方法应该是模型类的方法?

时间:2011-09-18 20:40:47

标签: python django

这是设计问题。

让我们假设我们在Django中有这种模型:

class Payment(models.Model):
  purchase = ForeignKeyField(Purchase)
  net_price = DecimalField()
  is_accepted = BooleanField()

  def set_accept(self):
    # there will be some logic, which touch purchase, send emails etc.

  def price_with_tax(self):
    return net_price * (1. + TAX)

我们还有一个名为 actions.py 的文件,我们实施了 有其他行动。 我们的问题是确定应该在 models.py 中放置哪种方法, 在 actions.py 中。 你知道任何常见的方法,指南或类似的东西吗? 我想尽可能地使用现有的解决方案。

由于

2 个答案:

答案 0 :(得分:6)

MVC框架(如Django)中的整体约定是将尽可能多的逻辑放入模型中。这有很多用途:

  • 它将你的逻辑与你的数据联系起来(好事)。
  • 使代码中的一个位置可以轻松查找所有数据操作方法。
  • 允许您直接在模型上运行方法,而无需依赖视图(使测试更简单)。
  • 为您提供在模板中使用的非常“干净”的API,例如:{{ object.price_with_tax }},而不是为不同的行为呈现不同的视图。

对于您的项目布局,您应该尝试在models.py文件中保留适用于模型的任何代码,并尽量避免使用actions.pyhelpers.py,除非确实< / em>需要它。如果你确实有大量代码不适合放入models.py(也许你正在实现算法或其他东西),那么惯例是使用helpers.py

你可以在以后做更多的事情来保持你的应用程序层次结构清洁和有条理,但这是所有这一切的基本要点。

答案 1 :(得分:0)

django中的标准方法是将直接在表行中运行的代码放在模型中,并在管理器中使用多行或基于表的代码。

class MyManager(models.Manager):
    def do_something_with_some_rows(self):
        query = self.filter(...)
        result = do_someting_with_this_query(query)
        return result

class MyModel(models.Model):
    objects = MyManager()

然后你可以像这样使用这个经理

>>> result = MyModel.objects.do_something_with_some_rows()
正如rdegges所说,这使得你的api更清洁,更易于使用,而且测试也更容易。

https://docs.djangoproject.com/en/dev/topics/db/managers/#managers