【问题标题】:Django: Select related over nested foreign keysDjango:选择相关的嵌套外键
【发布时间】: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 中@?

【问题讨论】:

    标签: django database caching many-to-many


    【解决方案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 更有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 2021-10-04
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多