应该在哪里放置自定义查询功能?

时间:2011-11-10 21:41:11

标签: python django oop orm

在Django应用程序中,几个视图可能包含类似的数据库查询。 例如,查询所有实体,其中is_active = True且is_online = True。 在重构期间,需要将这样的重复调用移动到函数中,问题是最好放置此过滤器/查询函数。

1)进入类/实体的定义?但是,对象应该“知道”它自己的过滤方法吗? 这似乎是一种典型的解决方案,但可能不是一个好的设计,因为选择感觉是对象外部的一个特征。另一方面,对象内部的这种方法不会产生副作用,看起来非常安全。 2)进入一些处理过滤的模块/命名空间,如filter.Users,filter.Entities? 或者在其他地方?

什么是最佳做法?

1 个答案:

答案 0 :(得分:3)

这正是model Managers的用途。

class MyActiveManager(models.Manager):
    def active(self):
        return self.filter(is_active=True)

    def online(self):
        return self.filter(is_online=True)


class MyModel:
    ...
    objects = MyActiveManager()

...

active_objects = MyModel.objects.active()
online_objects = MyModel.objects.online()