使用django在query会话中存储一个queryset

时间:2009-12-29 17:04:14

标签: python django session django-queryset paginate

我在会话中存储大型查询集时遇到问题。此查询集来自搜索,我需要将其存储在每个结果中的paginate中。这是我视图中的代码:

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

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

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

4 个答案:

答案 0 :(得分:3)

您只能存储PK列表,然后在需要时查询它们。

答案 1 :(得分:3)

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

在您的情况下,您可以从网址生成参数列表。

 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)

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

大型会议吃资源(我想Django也不例外) 将其设为JSON列表,然后使用用户的浏览器本地存储:http://jstorage.info,一个jQuery插件,跨浏览器。
您需要一种方法来判断数据是否已过时(校验和?尚未找到解决方案)以返回服务器并在模板中请求新的JSON var。