2017-04-06 16 views
0

クエリーセットは怠け者ですが、この場合にDjangoがどのように動作するかはわかりません。 2つの変数user_tokensuser_last_tokenを出力したいとしましょう。Djangoクエリーセットでのパフォーマンス

例A

@classmethod 
def get_all_tokens(cls, user): 
    return cls.objects.filter(user=user, usage=cls.PHONE_VALIDATION) 

@classmethod 
def get_last_token(cls, user): 
    return cls.get_all_tokens(user).latest('created_at') 

@classmethod 
def play_with_tokens(cls, user): 
    user_tokens = cls.get_all_tokens(user, True) 
    user_last_token = cls.get_last_token(user, True) 

    print(user_tokens) 
    print(user_last_token) 

例B

@classmethod 
def get_all_tokens(cls, user): 
    return cls.objects.filter(user=user, usage=cls.PHONE_VALIDATION) 

@classmethod 
def play_with_tokens(cls, user): 
    user_tokens = cls.get_all_tokens(user, True) 
    user_last_token = user_tokens.latest('created_at') 

    print(user_tokens) 
    print(user_last_token) 

が速くよりBです: これらの例間のパフォーマンスの違いはありますか?ありがとう。

+0

これは怠惰な回答かもしれませんが、django-debug-toolbarでそれらを試して評価することができます。 – aliva

+0

2番目のprint文が新しいデータベース参照を呼び出さないため、Bが高速です。これは、user_tokens変数からキャッシュされたデータを使用します。 – dentemm

答えて

0

DBのパフォーマンスは同じです。

>>> from django.db import connection, reset_queries 
>>> reset_queries() 
>>> run your code here... 
>>> connection.queries 

4つのクエリが表示されます。最初のクエリは3番目のクエリ、2番目のクエリは4番目のクエリになります。

この:

user_last_token = user_tokens.latest('created_at') 

がキャッシュされたクエリセットが、問題新しいSQLクエリを使用していません。

0

上記のように、djangoクエリセットは怠惰なので、上記の両方の場合、クエリは値を印刷しているときにのみ実行されます。

両方の例に2つのprint文が含まれていて、ここで同じ値が出力されているため、クエリ数とクエリ自体は同じままです。

user_tokensuser_last_tokenのクエリの唯一の違いは、後で一つcreated_at(降順)に基づいてトークンを注文した結果で最初のものを取ることです。

関連する問題