我知道查询集是懒惰但不确定Django在这种情况下的行为。
我们要说我要打印2个变量user_tokens
和user_last_token
。
这些示例之间是否存在性能差异:
@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)
@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快吗?感谢。
答案 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_tokens
和user_last_token
的查询的唯一区别在于,后者会根据created_at
(降序)对令牌进行排序,并在结果中获取第一个令牌。 / p>