Django:选择相关的嵌套外键

3 database django caching many-to-many

我有:

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)
Run Code Online (Sandbox Code Playgroud)

我是这样定义的AList,因为我的代码将定义更有意义的函数,当与 A 列表一起使用时,而不是 A。即元数据内容等。

现在,我的问题是,如何使用select_related/prefetch_related以便在运行过滤器查询时可以保存所有A实例?xAListB

sch*_*ggl 8

以下将起作用:

b_qs = B.objects.prefetch_related('a_list__list_of_a')
Run Code Online (Sandbox Code Playgroud)

现在

for b in b_qs:
    x = b.a_list.list_of_a.all()
Run Code Online (Sandbox Code Playgroud)

将导致三个数据库查询:

使用m2n 表上的 an获取 table B、 tableAList和table :AINNER JOIN

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
Run Code Online (Sandbox Code Playgroud)