将`objects'修改为*always*返回对象的子集



我有一个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_eventsEvent.type_events,因此代码清楚地提示了您使用的子集。

最新更新