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 上)?

Django - 使用 2 个嵌套外键复制模型实例

基于外键过滤数据 - Django

django-rest-framework:如何更新嵌套的外键?我的更新方法甚至没有被调用

Django查询带注释并选择相关的一起

选择时的 Django 外键名称