我有一个Events
表,其中包含各种类型的事件。我只关心其中一种。因此,我写的每个查询都以开始
Events.objects.filter(event_type="the_type").
etc(...).etc(...)`.
显然,这是重复的,很容易忘记。有没有一种方法可以使用自定义Manager
,使objects
属性始终返回特定的行子集,而无需明确要求?或者以任何其他方式将模型限制为特定的行子集??
是的,我们可以让一个经理像:
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
管理器的经验是,它会造成很大的危害,例如,如果您想设置所有事件的属性,那么编写Event.objects.all().update(foo='bar')
将只更新the_type
类型的事件,而代码建议不要这样做。
就我个人而言,我认为最好用一个不同的名字来构建一个经理,这至少暗示了一些东西被过滤了,例如:
class Event(models.Model):
# ...
all_events = models.Manager()
type_events = EventManager()
这里Event.objects
已经不存在了,但您编写了Event.all_events
或Event.type_events
,因此代码清楚地提示了您使用的子集。