模型类应该有哪些方法?
这是一个设计问题。
假设我们在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
在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所说,这样做让你的接口更加简洁易用,也更容易进行测试。
https://docs.djangoproject.com/en/dev/topics/db/managers/#managers
6
在MVC框架(比如Django)中,有个普遍的规则就是尽量把逻辑放在模型里面。这么做有很多好处:
- 它把你的逻辑和数据绑定在一起(这是一件好事)。
- 让你在代码中可以很方便地找到所有处理数据的方法。
- 可以直接在模型上运行这些方法,而不需要依赖视图(这样测试起来更简单)。
- 给你在模板中使用一个非常“干净”的接口,比如:
{{ object.price_with_tax }}
,而不是为不同的行为渲染不同的视图。
在你的项目结构中,尽量把所有处理模型的代码放在models.py文件里,尽量避免使用actions.py
或helpers.py
,除非你真的需要。如果你有很多不适合放在models.py里的代码(比如你在实现一些算法),那么可以使用helpers.py
。
之后还有很多方法可以让你的应用结构保持干净和有序,但这就是最基本的原则。