Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模型类的方法应该是什么样的方法?_Python_Django - Fatal编程技术网

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

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.

这是设计问题

假设我们在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中。 你知道什么常用的方法、指南或类似的东西吗? 我希望尽可能多地使用现有的解决方案


多亏了

MVC框架(如Django)的总体惯例是将尽可能多的逻辑放入模型中。这有很多目的:

  • 它将您的逻辑绑定到您的数据(好东西)
  • 可以很容易地在代码中查找所有数据操作方法的一个位置
  • 允许您直接在模型上运行方法,而不依赖于视图(使测试更简单)
  • 为您的模板提供了一个真正“干净”的API,例如:
    {{object.price\u with_tax}}
    ,而不是针对不同的行为呈现不同的视图
对于项目布局,您应该尝试在models.py文件中保留在模型上工作的任何代码,并尽量避免使用
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更干净、使用更简单,而且测试也更容易