【问题标题】:store a queryset in the session with django使用 django 在会话中存储查询集
【发布时间】:2010-12-30 20:21:18
【问题描述】:

我在会话中存储大查询集时遇到问题。此查询集来自搜索,我需要将其存储在每个结果中以进行分页。这是我认为的代码:

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

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

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

【问题讨论】:

    标签: python django session django-queryset pagination


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

       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)
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 这样做的问题是查询结果可能会因页面而异。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2017-06-02
          • 2014-06-29
          • 2017-01-14
          • 1970-01-01
          • 2023-03-03
          • 2013-12-13
          • 2014-09-20
          • 2020-05-13
          • 1970-01-01
          相关资源
          最近更新 更多