使用Django查询集的性能

时间:2017-04-06 10:50:31

标签: django django-queryset

我知道查询集是懒惰但不确定Django在这种情况下的行为。 我们要说我要打印2个变量user_tokensuser_last_token。 这些示例之间是否存在性能差异:

示例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比A快吗?感谢。

2 个答案:

答案 0 :(得分:0)

对于DB性能,它们是相同的。您可以使用

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

您将看到4个查询:第一个查询等于第三个查询,第二个查询等于第四个查询。

此:

user_last_token = user_tokens.latest('created_at')

不使用缓存的查询集,但会发出新的SQL查询。

答案 1 :(得分:0)

正如您所提到的,django查询集是惰性的,因此在上述两种情况下,只有在打印值时才会执行查询。

因为这两个示例都包含两个打印语句并且在此处打印相同的值,所以查询数和查询本身将保持不变。

user_tokensuser_last_token的查询的唯一区别在于,后者会根据created_at(降序)对令牌进行排序,并在结果中获取第一个令牌。 / p>