当外键相同时,为什么django ORM会多次检索相同的相关对象?

问题描述

给出以下代码

class Customer(models.Model):
    name = models.CharField(max_length=30)

class Project(models.Model):
    name = models.CharField(max_length=30)

for p in Project.objects.all():
   print (p.name,p.customer.name)

然后我创建以下对象:

customer 1
  project 1
  project 2
  project 3
customer 2
  project 1
  project 2
  project 3

for循环按预期打印结果:

Project 1 Customer 1
Project 2 Customer 1
Project 3 Customer 1
Project 4 Customer 2
Project 5 Customer 2
Project 6 Customer 2

通过检查connection.queries,我发现django已经执行了7个查询

'SELECT "myapp_project"."id","myapp_project"."customer_id","myapp_project"."name","myapp_project"."is_active" FROM "myapp_project"'
'SELECT "myapp_customer"."id","myapp_customer"."name","myapp_customer"."is_active" FROM "myapp_customer" WHERE "myapp_customer"."id" = 1 LIMIT 21'
'SELECT "myapp_customer"."id","myapp_customer"."is_active" FROM "myapp_customer" WHERE "myapp_customer"."id" = 2 LIMIT 21'
'SELECT "myapp_customer"."id","myapp_customer"."is_active" FROM "myapp_customer" WHERE "myapp_customer"."id" = 2 LIMIT 21

但是我的问题是,为什么django ORM重复相同的查询3次以检索与项目1、2和3相关的customer 1?我认为客户数据将存储在缓存中,总共将仅执行3个查询,如下所示:

'SELECT "myapp_project"."id","myapp_customer"."is_active" FROM "myapp_customer" WHERE "myapp_customer"."id" = 2 LIMIT 21'

我敢打赌,这是设计使然。这种行为背后的原因是什么?

谢谢

(PS:我知道可以使用select_related并且仅使用一个查询将两个实体连接在一起,但这更多是一个概念性问题):

Project.objects.select_related('customer')

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)