关于python:使用django在session中存储一个queryset

store a queryset in the session with django

我在会话中存储大型查询集时遇到问题。这个查询集来自一个搜索,我需要将它存储起来以便在每个结果中分页。这是我视图中的代码:

1
2
c = queryset.order_by('-order')
request.session['query_search'] = c

你可以在我的网站上看到一个例子:http://www.lukmi.com/sawards/barcelona/这是一个结果列表(查询集),我将它存储在会话中,因为我需要在每个概要文件中使用它来转到下一个概要文件。

我有一些问题要保存它,因为它很大。有人知道一个好的解决方案吗?


我目前正在开发一个非常类似的网站,你也在Django。我将查询集存储在cache中,cache键是一个用urlencoded表示的搜索参数字符串-这样,如果有人执行相同的搜索,就不必重复昂贵的查询来获得相同的结果。

在您的例子中,您可以从URL生成参数列表。

1
2
3
4
5
6
7
8
9
10
11
12
 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)


您只能存储pk列表,然后在需要时通过它们进行查询。


大会议吃资源(我想姜戈也不例外)。把它作为JSON列表,然后使用用户的浏览器本地存储:http://jstorage.info,一个jquery插件,cross-browser。您需要一种方法来判断数据是否过时(校验和?还没有找到解决方案)返回服务器并在模板中请求一个新的JSON变量。


或者您可以存储查询生成的SQL,然后执行。

1
request.session['query_search'] = c.query.as_sql()