模型类应该有哪些方法?

5 投票
2 回答
624 浏览
提问于 2025-04-17 02:33

这是一个设计问题。

假设我们在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.pyhelpers.py,除非你真的需要。如果你有很多不适合放在models.py里的代码(比如你在实现一些算法),那么可以使用helpers.py

之后还有很多方法可以让你的应用结构保持干净和有序,但这就是最基本的原则。

撰写回答