【发布时间】:2012-09-20 03:17:02
【问题描述】:
我正在开发一个需要过滤大量记录的应用。 我一直在阅读有关缓存 QuerySet 和相关内容的内容,并找到了一些很好的材料。例如:
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。对于其中一些,我需要使用 &= 而不是 |=。
问题:- 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 小时内无法回复。
【问题讨论】:
标签: django django-models django-orm django-cache