我应该在Django中使用controllers.py还是@staticmethod?

时间:2015-04-22 20:37:01

标签: python django

我们团队中最初教我们django(后来离开)的人使用了controller.py文件来执行帮助功能。许多这些函数与类直接相关。我更喜欢使用@staticmethod来容纳这些帮助者与他们相关的类。例如,而不是这样做:

# controllers.py
def process_entry():
    # do some exciting stuff that might not have to do with an instance

这样称呼:

from myapp.controllers import process_entry
process_entry()

我更喜欢这个:

# models.py
class Entry(models.Model):
    name = CharField...
    # some other fields

    @staticmethod
    def process_entry():
    # do some exciting stuff that might not have to do with an instance

这样称呼:

from myapp.models import Entry
Entry.process_entry()

是否有一种首选的,标准的方式来处理这种情况或仅仅是个人偏好?有没有其他人使用controllers.py文件?那里有什么?

感谢。

编辑:

可能是一个更好的例子,佣金。

# models.py
class Commission(models.Model):
    check = ForeignKey
    payment = ForeignKey
    # other fields

class Check(models.Model):
    # fields

class Payment(models.Model):
    # fields

每当修改支票或付款实例时,对任何相关的佣金实例进行调整,或者在有人想要手动运行佣金的任何时候,他们都可以这样做。那么run_commissions()应该去哪里?我更喜欢这个,但显然这不应该封装在与数据相关的模型中吗?

# models.py
class Commission(models.Model):
    check = ForeignKey
    payment = ForeignKey
    # other fields

   @staticmethod 
   def run_commissions():
       # do stuff

1 个答案:

答案 0 :(得分:0)

静态方法用于在一个类中对相关函数进行分组(主要用于工厂方法),除此之外,静态方法和函数之间没有区别。

BUT。在您的示例中,您正在为DATABASE模型分配行为。 DATABASE模型不是LOGIC模型,您应该将它们与应用程序逻辑分开。无论如何,控制器在这个问题上也是一个坏名字。

我不确定 process_entry 是做什么的,但是如果它只改变一个Entry实体,那么它可以命名为:Entry.process(),但不是Entry作为DB模型!只是另一个入门课程。但是,如果该函数不仅仅是更改Entry,那么它不应该分配给Entry实体,而应该作为服务函数。