Django:选择相关的嵌套外键

时间:2017-01-23 18:23:12

标签: django database 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)

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

现在,我的问题是,如何使用select_related / prefetch_related,以便我可以将所有A个实例以及x保存在AList中当我在B上运行过滤查询时?

1 个答案:

答案 0 :(得分: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表格上的B获取表格AList,表格A和表格INNER 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