2011-09-18 64 views
5

这是设计问题。什么样的方法应该是模型类的方法?

让我们假定我们有这种模型在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。 你知道任何常见的方法,指导或类似的东西吗? 我想尽可能使用现有的解决方案。

感谢

回答

6

在MVC框架(如Django的)总体约定是尽可能多的逻辑地放入您的机型。这有很多目的:

  • 它将您的逻辑绑定到您的数据(好东西)。
  • 使所有数据操作方法的代码中的一个地方变得容易。
  • 允许您直接在模型上运行方法而不依赖视图(使测试更简单)。
  • 给你一个非常“干净”的API在你的模板中使用,例如:{{ object.price_with_tax }},而不是为不同的行为渲染不同的视图。

为您的项目布局时,应尽量保留在你的models.py文件中的模型作品的任何代码,并尽量避免使用actions.pyhelpers.py,除非你真的需要它。如果你确实有很多不适合放入models.py的代码(也许你正在实现算法或其他),那么约定就是使用helpers.py

以后还有很多东西可以让你的应用程序层次结构保持清洁和有组织,但这是它的基本要点。

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

相关问题