在Django中预取时遵​​循嵌套的外键

时间:2019-04-01 10:31:48

标签: django nested prefetch

我有一个信息模型,它具有深而复杂的外键关系。还有很多因此,我试图使用SkyCoord.separationselect_related()来最小化对数据库的查询数量。

但是,我遇到了一个问题,我无法找出一种方法来使预取运算符将外键遵循任意深度。我知道双下划线运算符(prefetch_related()),但这并不是真正的选择,因为我事先不知道嵌套的深度。

例如,假设我有对象__。任何对象都可以具有任意数量的外键,这些外键指向出现在字母表中稍后的任何对象。例如,如何确保预取从A, B, C,...Z指向A的外键将遵循B上的所有外键?

到目前为止,我最好的方法是对对象管理器上的B方法进行半硬编码。

提前谢谢

编辑

好吧,关于我现在如何尝试的想法如下:

get_queryset()

现在我正在预取的字段中有我想关注的外键关系。我该如何实现(不使用 class MyModelmanager(model.Manger): def get_queryset() qs = super().get_queryset() qs = qs.select_related(*thefiledsiwannaprefetch) return qs )?

编辑2

另一种尝试是:

'__'

然后,我确实覆盖了其他模型的管理,以便他们也使用其 class MyModelmanager(model.Manger): def get_queryset() return super().get_queryset().prefetch_related() 方法执行预取。这也行不通。

1 个答案:

答案 0 :(得分:1)

来自docs

  

在某些情况下,您可能希望调用带有许多相关对象的select_related(),或者您不知道所有关系。在这些情况下,可以不带任何参数调用select_related()。这将跟随它可以找到的所有非空外键-必须指定可空外键。在大多数情况下,我们不建议这样做,因为这可能会使基础查询变得比实际需要更复杂,并返回更多数据。