缓存查询集和过滤疑惑

时间:2012-09-28 08:44:28

标签: django django-models django-orm django-cache

我正在开发一款需要我过滤大量记录的应用。 我一直在阅读有关缓存QuerySets和相关内容的文章,并找到了一些很好的材料。例如:

Caching query results in django https://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets

还有一些关于QuerySet工作等的东西。 https://docs.djangoproject.com/en/dev/topics/db/optimization/#understand-queryset-evaluation https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.iterator

但有些事情仍然不清楚。

在我的应用程序中,它有点像这样:[我确实有验证等,而不是写在这里]

qs = MyModel.objects.filter(Q( <initial_filter_to_narrow_down_size>  ))

#I let user to specify other filters and I use qs further

q_object = Q(< [using user_made_filters].pop()> )
for filter in user_made_filters:
    q_object |= Q( <using filter> )

qs = qs.filter(q_object)

可以有n个user_made_filters。对于其中一些我需要做&amp; =而不是| =。

的问题: - 1]

qs = MyModel.objects.filter(Q(<initial_filter_to_narrow_down_size>))

在此之后,我希望将此qs放在缓存中供以后使用。我想在不点击数据库的情况下应用所有其他过滤器。

之类的东西
cache.set('qs', qs)

但是当我这样做时会发生什么     qs = qs.filter(q_object)? 缓存会被修改吗?我不希望这样。我希望qs保持不变,直到我更新它。 在这种情况下我该怎么做?

2]就像我之前说的那样,我生成OR'ed或ANDed Q对象,我一直在做      qs = qs.filter(q_object)。 我这样做是因为我一次找到相似类型的过滤器,应用它们然后获得另一种类型的过滤器并继续。我还需要优先考虑一些过滤器。它们将首先应用,然后再应用其余部分。 之间有什么区别:问这个是因为在我的想法中我的qs是(a)类型。

(a) MyModel.objects.filter( Q(condition1) ).filter( Q(condition2) ) and
(b) MyModel.objects.filter( Q(condition1) & Q(condition2) ) ?

我的意思是当最终评估qs时,django会按照(a)进行评估吗? 或者它会结合所有过滤器并像(b)一样评估它?

此致

ps-将无法回复2-3小时。

1 个答案:

答案 0 :(得分:0)

1)否,除非您再次设置缓存值,否则不会修改缓存值 2)是的,应用两个过滤器就像对它们进行AND运算。您可以通过编写以下内容来验证这两个查询集是否生成完全相同的sql:

qs1 = MyModel.objects.filter( Q(condition1) ).filter( Q(condition2) )
qs2 = MyModel.objects.filter( Q(condition1) & Q(condition2) )
unicode(qs1.query) == unicode(qs2.query)