我有一个Events
表,其中包含各种类型的事件。我只关心其中一种类型。结果,我写的每个查询都以
Events.objects.filter(event_type="the_type").\
etc(...).etc(...)`.
显然,这是重复的并且容易忘记。有没有一种使用自定义Manager
的方法,以使objects
属性始终返回行的特定子集,而无需明确要求?或任何其他将模型限制为特定行子集的方式?
答案 0 :(得分:3)
是的,我们可以让经理成为:
from django.db import models
class EventManager(models.Manager):
def get_queryset(self):
return super(EventManager, self).get_queryset().filter(event_type="the_type")
,然后将管理器添加到Event
类中:
class Event(models.Model):
# ...
objects = EventManager()
但是请注意,Django的某些部分将不使用.objects
,而是使用._base_manager
,因此仍然返回整个集合。此外,我自己在重写.objects
管理器方面的经验是,事实证明,这样做会造成很多危害,例如,如果您想设置 all 事件的属性,然后编写{{1 }}只会更新类型为Event.objects.all().update(foo='bar')
的事件,而代码则相反。
我个人认为,最好使用一个不同的名称来构造经理,这至少暗示某些内容已被过滤,例如:
the_type
这里class Event(models.Model):
# ...
all_events = models.Manager()
type_events = EventManager()
不再存在,但是您写了Event.objects
或Event.all_events
,因此代码清楚地暗示了您要使用的子集。