当您从缓存查询请求对象的属性时,django是否会命中数据库?

时间:2018-04-15 09:18:47

标签: python django database caching memcached

我无法理解如何正确使用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?

我错过了什么学习?你能指导我吗?提前谢谢你。

2 个答案:

答案 0 :(得分:1)

您可以随时安装django-debug-toolbar并亲眼看看。

但是,应该很清楚,Django不会为缓存的内容访问数据库。您在此处缓存了Books查询集。因此,该查询集上立即可用的任何内容都不会访问数据库。因此.title将从缓存中提供;但是.author是User表的外键,其值不会被缓存,因此访问它将会访问数据库。

根据定义,调用.filter()始终意味着进行数据库查询。

答案 1 :(得分:1)

您可以安装django-extensions,然后在已安装的应用程序中注册它,然后在django shell中运行“ python manage.py shell_plus --print-sql”。 我认为您可以更好地了解查询的执行方式。