gpt4 book ai didi

django - 缓存查询集和过滤疑问

转载 作者:行者123 更新时间:2023-12-04 18:33:05 24 4
gpt4 key购买 nike

我正在开发一个需要我过滤大量记录的应用程序。
我一直在阅读有关缓存 QuerySet 和相关内容的信息,并找到了一些很好的 Material 。例如:

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 小时内无法回复。

最佳答案

1)不,缓存值不会被修改,除非你重新设置它。
2)是的,应用两个过滤器就像对它们进行ANDing。您可以通过编写以下代码来验证两个查询集是否生成完全相同的 sql:

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

关于django - 缓存查询集和过滤疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12636591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com