我有:
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
上运行过滤查询时?
答案 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