Django - 这些查询集会被缓存吗?

时间:2014-03-05 15:43:07

标签: database django caching django-models

class UnassignedThread(models.Manager):
    def get_queryset(self):
        return super(UnassignedThread,
                self).get_queryset().filter(
                        _irc_name__isnull=True)

是否会缓存results = ThreadVault.unassigned_threads.all()?我不确定_isnull=True是否算作评估(因为评估会导致缓存)。

另外,如果有一个名为ThreadVault的模型,我想查找数据库中是否存在#777和#888这样的线程,哪种方式最好利用缓存进行查找?

ThreadVault.objects.get(thread_id="777")
ThreadVault.objects.get(thread_id="888")

results = ThreadVault.objects.all()
for ticket in results:
    if ticket.thread_id == "777" or ticket.thread_id == "888":
        do something

2 个答案:

答案 0 :(得分:2)

不,查询集在切片或迭代之前都是惰性的。 filter只是为查询添加条件,但不会对其进行评估。

对于你的第二个问题,这两个问题都不是很好,虽然第一个问题比第二个问题更为可取(它涉及加载和迭代表中的每个对象)。相反,您应该将exists()__in过滤器结合使用:

ThreadVault.objects.filter(thread_id__in=["777", "888"].exists()

这些问题都与缓存无关。

答案 1 :(得分:1)

th_ids = ["777","888"]

ThreadVault.objects.filter(thread_id__in=th_ids).exists()

用于缓存您的视图

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)

def my_view(request):