Django:选择相关的嵌套外键
Posted
技术标签:
【中文标题】Django:选择相关的嵌套外键【英文标题】:Django: Select related over nested foreign keys 【发布时间】:2017-06-08 08:37:50 【问题描述】:我有:
class A(models.Model):
pass
class AList(models.Model):
list_of_a= models.ManyToManyField(A)
random_statistical_info=models.CharField()
class B(models.Model):
a_list = models.ForeignKey(AList)
我正在像这样定义AList
,因为我的代码将定义更有意义的函数,当与 A 列表而不是 A 一起使用时。即元数据内容等。
现在,我的问题是,我如何使用select_related
/prefetch_related
以便在对@987654328 运行过滤查询时将所有A
实例以及x
保存在AList
中@?
【问题讨论】:
【参考方案1】:以下将起作用:
b_qs = B.objects.prefetch_related('a_list__list_of_a')
现在
for b in b_qs:
x = b.a_list.list_of_a.all()
将产生三个数据库查询:
在 m2n 表上使用 INNER JOIN
获取表 B
、表 AList
和表 A
:
1 SELECT app_b.*
FROM app_b
2 SELECT app_alist.*
FROM app_alist
WHERE app_alist.id IN (1, 2, ...) # fk values from 1
3 SELECT (app_alista.alist_id) AS _prefetch_related_val_alist_id,
app_a.*
INNER JOIN app_alista ON app_a.id = app_alista.a_id
WHERE app_alista.alist_id IN (1, 2, ... ) # pk values from 2
【讨论】:
拯救了我的一天,但我想知道为什么在这种情况下 prefetch 比 select_related 更有效以上是关于Django:选择相关的嵌套外键的主要内容,如果未能解决你的问题,请参考以下文章
Django - 如何在相关模型上为外键创建多个选择(在 CreateView 上)?