0

私が持っているとします:

models.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.authororを使用しbook_one.priceて、データベースをインスタンス化する場合にのみ、データベースに再度アクセスするつもりはありません。

入力books = Books.objects.all()してmanage.py shell、その特定の値を保存したいとしましょう(保存titleとフィールドのみが必要だとしましょう)のようなループauthorを使用して空のリストに:for

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

問題は、上記のループに基づいて、データベースに何回ヒットするかということです。過ぎたから2回なbook.titlebook.authorか1回だけなのか

4

3 に答える 3

2

上記のコードを想定すると、入力するとbook_one.author、データベースに再度ヒットします。

正しくない。.defer()モデル内のすべての単純なフィールドは、または使用されていない限り、データベースから取得.only()されます。

select_related()if i type book_one.titleor book_one.authororを使用しbook_one.priceて、データベースをインスタンス化する場合にのみ、データベースに再度アクセスするつもりはありません。

select_related()ForeignKeyOneToOneFieldなどの関連フィールドのみに影響します。

上記のループに基づいて、データベースに何回ヒットするでしょうか?

一度。ただし、.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

あなたの仮定は正しくありません。クエリセットは lazyであり、評価されたときにのみ実行されます。

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