Python 模型类的方法应该是什么样的方法?
这是设计问题 假设我们在Django中有这种模型:Python 模型类的方法应该是什么样的方法?,python,django,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.
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中。
你知道什么常用的方法、指南或类似的东西吗?
我希望尽可能多地使用现有的解决方案
多亏了MVC框架(如Django)的总体惯例是将尽可能多的逻辑放入模型中。这有很多目的:
- 它将您的逻辑绑定到您的数据(好东西)
- 可以很容易地在代码中查找所有数据操作方法的一个位置
- 允许您直接在模型上运行方法,而不依赖于视图(使测试更简单)
- 为您的模板提供了一个真正“干净”的API,例如:
,而不是针对不同的行为呈现不同的视图{{object.price\u with_tax}}
actions.py
或helpers.py
,除非您确实需要它。如果您确实有大量不适合放入models.py中的代码(可能您正在实现算法或其他东西),则惯例是使用helpers.py
以后,为了保持应用程序层次结构的整洁和有序,您还可以做很多事情,但这是最基本的要点。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更干净、使用更简单,而且测试也更容易