我编写了一个抽象基类,它将我的一些表的公共字段组合在一起。我希望能够使用管理器以相同的方式查询所有这些字段。
class TemporalModel(models.Model):
objects = models.Manager()
today = TodayManager()
time = models.DateTimeField()
class Meta:
abstract = True
get_latest_by = 'time'
如上所示,一个简单的示例是能够查询 TemporalModel 的子类(它们都有一个“时间”字段)以获取今天的条目。
我因此写了一个经理:
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(时间未定义)。我认为这与这个问题的原因相同- 该字段不在抽象类上,而是在子类上。
但是,我从来没有真正在抽象类上调用它。如果我有以下内容:
class SomeTemporalThing(TemporalModel):
pass # I'm a real table! :)
然后我希望能够调用,例如 SomeTemporalThing.today.all(),并让 django 在子表上执行时间 >= 今天/时间 < 明天查找。
是否可以在不将管理器定义移动到子类的情况下实现这一点(这会导致重复)?
我对自定义管理器文档的阅读表明它应该是可能的,但我不知道如何做。