在单个QuerySet中按时间戳排序获取多个模型

时间:2019-03-21 01:21:25

标签: python django django-models

我正在处理一个由用户执行的所有事件组成的表,尽管这些事件由4种不同的模型表示。

模型是:

  • WebhookSubscription
  • WebhookEvent
  • TokenRefresh
  • LogEvent

我希望这些内容在用户的仪表板中都可见,但在单个表中按时间戳排序。我可以对每个模型进行单个查询,然后附加到字典中,然后按日期对字典进行排序,但是,如果有一个原始解决方案,我也不想违背(而且我不认为这是一个边缘情况,所以我可以预见)。

是否存在一种在单个QuerySet中检索多个模型的本地方法?

1 个答案:

答案 0 :(得分:1)

没有原生方法可以在单个QuerySet中检索多个不相关的模型。您可以做的是使用模型继承,为所有事件模型提供一个基础模型。具有以下模型结构;

class Event(models.Model):
    timestamp = models.DateTimeField()
    user = models.ForeignKey(User)
    ...

class WebhookSubscription(Event):
   ...

class WebhookEvent(Event):
   ...

class TokenRefresh(Event):
   ...

class LogEvent(Event):
   ...

您可以使用Event模型直接查询;

events = Event.objects.filter(user=user).order_by('timestamp')

这将为您提供Event实例,该实例将不保存子模型的数据。您可以像遵循 OneToOneField 一样从父级获取子实例(这就是django hadnles如何实际继承模型,创建两个表并将它们与外键链接):

event.webhooksubscription
event.webhookevent
event.tokenrefresh
event.logevent

如果存在父模型,则返回子模型实例,如果父模型没有相关的指定子模型实例,则抛出 ObjectNotFound 异常。

这种方法将使您能够在数据库级别执行诸如排序和切片之类的操作,但缺点是增加了模型的复杂性(您将需要一个单独的查询来获取子模型数据)