自定义管理器 - 查询抽象基类

时间:2013-01-23 05:23:40

标签: python django django-models

我编写了一个抽象基类,它将一些表的常用字段组合在一起。我希望能够使用经理以相同的方式查询所有这些字段。

class TemporalModel(models.Model):
    objects = models.Manager()
    today = TodayManager()

    time = models.DateTimeField()

    class Meta:
        abstract = True
        get_latest_by = 'time'

如上所示,一个简单的例子就是能够查询今天条目的TemporalModel的子类(它们都有'time'字段)。

我这样写了一位经理:

class TodayManager(models.Manager):
    def get_query_set(self):
        now = timezone.now()
        today = datetime(now.year, now.month, now.day, tzinfo=now.tzinfo)
        tomorrow = today + timedelta(days=1)

        qs = models.Manager.get_query_set(self).filter(time >= today)
        qs = qs.filter(time < tomorrow)

        return qs

尝试使用此命令会失败并出现NameError(未定义时间)。我认为这与this question中的原因相同 - 该字段不在抽象类上,而是在子类上。

但是,我从来没有在抽象类上实际调用它。如果我有以下内容:

class SomeTemporalThing(TemporalModel):
    pass # I'm a real table! :)

然后我希望能够调用,例如,SomeTemporalThing.today.all(),并让django执行时间&gt; =今天/时间&lt;明天在子表上查找。

是否可以在不将管理器定义移动到子类(这会导致重复)的情况下实现此目的?

我对custom manager documentation的阅读表明它应该是可能的,但我对如何做到难以理解。

1 个答案:

答案 0 :(得分:1)

你应该做什么。您看到的错误与Manager对象的继承无关,而与filter()的{​​{1}}函数的规范不正确。

而不是

QuerySet

应该是

qs = models.Manager.get_query_set(self).filter(time >= today)

这同样适用于您的qs = models.Manager.get_query_set(self).filter(time_gte=today) 过滤器参数。

请参阅QuerySet API documentation