问题描述
给出以下代码:
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 (将#修改为@)