在Django中将查询集存储到会话中
我在存储一个很大的查询结果到会话中遇到了问题。这个查询结果是来自搜索的,我需要把它存起来,以便在每个结果中进行分页。以下是我在视图中的代码:
c = queryset.order_by('-order')
request.session['query_search'] = c
你可以在我的网站上看到一个例子:http://www.lukmi.com/escorts/barcelona/。这是一个结果列表(也就是查询结果),我把它存储在会话中,因为我需要在每个个人资料中使用它,以便能跳转到下一个个人资料。
但是我在存储这个结果时遇到了一些问题,因为它实在太大了。有没有人知道一个好的解决办法?
4 个回答
0
或者你可以先把查询生成的SQL语句保存下来,然后再执行它。
request.session['query_search'] = c.query.as_sql()
3
我现在正在开发一个和你的网站很相似的项目,也是用Django做的。
我把查询结果存储在缓存里,缓存的键是搜索参数的一个经过编码的字符串。这样,如果有人进行相同的搜索,就不需要重复那些耗时的查询来获取相同的结果。
在你的情况下,你可以从网址中生成参数列表。
form = form_class(request.POST)
if form.is_valid():
cd = form.cleaned_data
persons = .... #expensive queries that fetch the results of search
cache_id = urlencode(cd.items())
#create md5 hash to use in link to results
cache_id = hashlib.md5(cache_id).hexdigest()
cache.set(cache_id, persons, CACHE_TIMEOUT)
#also store form data in cache, so the form can be easily reconstructed from cache id
cache.set(cache_id+'_form', request.POST, CACHE_TIMEOUT)
4
你可以只存储主键的列表,然后在需要的时候通过这些主键来查询数据。