我无法理解如何正确使用Caches Framework。让我说我有这个代码:
class Book(models.Model):
title = models.CharField()
author = models.ForeignKey(User)
@classmethod:
def get_all_books(cls):
query = cache.get_or_set(
'all_books',
cls.objects.all()
)
return query
现在我知道每次运行Book.get_all_books()
时它都会返回已经缓存的结果。但如果我在shell中运行此代码该怎么办:
>>> list = Book.get_all_books()
>>> list[0].title # does this line hits the database?
>>> list[0].author # does this line hits the database?
>>> list.filter(title='for dummies') # does this line hits the database?
我错过了什么学习?你能指导我吗?提前谢谢你。
答案 0 :(得分:1)
您可以随时安装django-debug-toolbar并亲眼看看。
但是,应该很清楚,Django不会为缓存的内容访问数据库。您在此处缓存了Books查询集。因此,该查询集上立即可用的任何内容都不会访问数据库。因此.title
将从缓存中提供;但是.author
是User表的外键,其值不会被缓存,因此访问它将会访问数据库。
根据定义,调用.filter()
始终意味着进行数据库查询。
答案 1 :(得分:1)
您可以安装django-extensions,然后在已安装的应用程序中注册它,然后在django shell中运行“ python manage.py shell_plus --print-sql”。 我认为您可以更好地了解查询的执行方式。