如果您有外部任务收集有关模型的信息,它是否应该作为方法存在于模型中?

时间:2013-09-13 14:35:48

标签: django django-models

例如,我们有一个方法可以从第三方API获取有关模型的其他信息。可以把它作为一种方法放在模型上,还是应该放在外面?

class Entity(models.Model):
    name = ...
    location = ...


    def fetch_location(self):
        # fetch the location from another server and store it.
        self.location = "result"

2 个答案:

答案 0 :(得分:1)

如果数据与实例相关,那么它可能是放置它的正确位置。只有当你得到很多这些内容时,你才可能希望将它们包装在一个不同的类中以便于你自己的可读性(即从实例角度了解内部和外部是什么)。

我通常这样做的方式:

  • 经理:与一组模型实例相关的任何内容
  • 模型:与单个模型实例相关的任何内容

答案 1 :(得分:0)

好吧,如果你从面向对象编程的角度思考,答案是肯定的:

如果“对象可以做某事”,则应将其作为成员函数(也称为方法)包含在内。

但是:如果几个不同的类需要相同的功能(例如“实体所有者”想要自己获取位置而不调用my_entity.fetch_location),你应该考虑在两个类之上的一个(抽象)类来实现行为。

如果你必须在没有现有实例的情况下调用该方法(在你的例子中似乎不是这种情况),你可以考虑在类之外编写方法,或者添加允许你的@staticmethod装饰器调用Entity.fetch_location(在这种情况下记得省略 self ,因为如果没有实例,就没有 self 。)我更喜欢静态方法而不是全局方法因为调用者总是知道它与哪个类相关。

@staticmethod
def fetch_location():
    # fetch the location from another server and store it.
    self.location = "result"