0

假设我有:

模型.py:

class Books(models.Model):

    title = models.CharField(max_length = 200)
    author = models.CharField(max_length = 200)
    price = models.CharField(max_length = 200)

并在manage.py shell

# hits the database
>>> book_one = Books.objects.get(id = 1)
# hits the database 
>>> foo = book_one.title
u'Foo book'

假设上面的代码,如果我输入book_one.author我们将再次访问数据库。

通过使用select_related()if i type book_one.titleor book_one.authororbook_one.price我们不会再次访问数据库,只有当我们实例化它时。

如果我输入books = Books.objects.all()并假设我想使用循环manage.py shell将其特定值(假设我只想存储titleauthor字段)存储在一个空列表中,例如:for

empty_list = []
for book in books:
    empty_list.append([book.title, book.author])
# only 1 data, so we're gonna loop only once

所以问题是:基于上面的循环,我们要访问数据库多少次?是因为我们通过了两次book.titlebook.author还是只有一次

4

3 回答 3

2

假设上面的代码,如果我输入book_one.author我们将再次访问数据库。

不正确。模型中的所有简单字段都是从数据库中提取的,除非使用.defer().only()

通过使用select_related()if i type book_one.titleor book_one.authororbook_one.price我们不会再次访问数据库,只有当我们实例化它时。

select_related()仅影响相关字段,例如ForeignKey,OneToOneField等。

基于上面的循环,我们将访问数据库多少次?

一次。但考虑.values_list('title', 'author')改用。

于 2012-09-13T11:46:17.023 回答
0

如果你有课

class Books(models.Model):

    title = models.CharField(max_length = 200)
    author = models.CharField(max_length = 200)
    price = models.CharField(max_length = 200)

现在,

>>> book_one = Books.objects.get(id = 1) # hits the database
>>> foo = book_one.title # does not hit the database

如果根本title是另一个表的外键,那么foo = book_one.title会命中数据库并使用select_related会为您保存这个数据库命中

于 2012-09-13T11:46:12.497 回答
0

你的假设是不正确的。查询集是惰性的,仅在评估时执行。

f = Books.objects.get(pk=1) # one hit
f.title # no hit
f.price # no hit
于 2012-09-13T11:49:26.807 回答