0

假设我有代码:

obj = MyUser.objects.get(pk=1)

name = obj.name
age = obj.age
email = obj.email
phone = obj.phone
city = obj.city

所以我有obj。这是一个包含有关 MyUser 对象的所有信息的数组还是只是一个参考?

我很有趣的是name = obj.name向数据库发送第一个请求,

age = obj.age向数据库发送第二个请求,

email = obj.email向数据库发送第三个请求,

phone = obj.phone向 DB 发送第四个请求,

city = obj.city向 DB 发送第五个请求

或者只有一个请求,当obj = MyUser.objects.get(pk=1).

它影响系统性能并不是秘密,所以这是一个非常有趣的问题。

谢谢!

4

1 回答 1

1

两者都不是:它是一个对象,其值在实例化时从数据库中初始化。默认情况下,Django 对整行进行选择,并使用列值来实例化对象。

按照您描述的方式进行操作将非常奇怪,而且效率极低。如果您要求查询集会发生什么?每行每列一个查询?

当然,您可以只请求某些列,通过使用valuesorvalues_list获取您感兴趣的列,或者通过使用deferoronly获取延迟某些字段的对象。

请注意,您可以询问 Django 它在做什么——在 shell 中,在调试模式下,执行

from django.db import connection
print connection.queries

这将为您提供该 shell 会话中截至该点的所有数据库查询的列表。

于 2011-11-24T09:07:38.867 回答