修改“对象”以“总是”返回对象的子集?

时间:2018-10-31 21:06:12

标签: python django

我有一个Events表,其中包含各种类型的事件。我只关心其中一种类型。结果,我写的每个查询都以

开头
Events.objects.filter(event_type="the_type").\
       etc(...).etc(...)`. 

显然,这是重复的并且容易忘记。有没有一种使用自定义Manager的方法,以使objects属性始终返回行的特定子集,而无需明确要求?或任何其他将模型限制为特定行子集的方式?

1 个答案:

答案 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.objectsEvent.all_events,因此代码清楚地暗示了您要使用的子集。