在Django应用程序中,几个视图可能包含类似的数据库查询。 例如,查询所有实体,其中is_active = True且is_online = True。 在重构期间,需要将这样的重复调用移动到函数中,问题是最好放置此过滤器/查询函数。
1)进入类/实体的定义?但是,对象应该“知道”它自己的过滤方法吗? 这似乎是一种典型的解决方案,但可能不是一个好的设计,因为选择感觉是对象外部的一个特征。另一方面,对象内部的这种方法不会产生副作用,看起来非常安全。 2)进入一些处理过滤的模块/命名空间,如filter.Users,filter.Entities? 或者在其他地方?
什么是最佳做法?
答案 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()