我有一个信息模型,它具有深而复杂的外键关系。还有很多因此,我试图使用SkyCoord.separation
和select_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()
方法执行预取。这也行不通。
答案 0 :(得分:1)
来自docs:
在某些情况下,您可能希望调用带有许多相关对象的select_related(),或者您不知道所有关系。在这些情况下,可以不带任何参数调用select_related()。这将跟随它可以找到的所有非空外键-必须指定可空外键。在大多数情况下,我们不建议这样做,因为这可能会使基础查询变得比实际需要更复杂,并返回更多数据。