我正在处理一个由用户执行的所有事件组成的表,尽管这些事件由4种不同的模型表示。
模型是:
我希望这些内容在用户的仪表板中都可见,但在单个表中按时间戳排序。我可以对每个模型进行单个查询,然后附加到字典中,然后按日期对字典进行排序,但是,如果有一个原始解决方案,我也不想违背(而且我不认为这是一个边缘情况,所以我可以预见)。
是否存在一种在单个QuerySet中检索多个模型的本地方法?
答案 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 异常。
这种方法将使您能够在数据库级别执行诸如排序和切片之类的操作,但缺点是增加了模型的复杂性(您将需要一个单独的查询来获取子模型数据)