【问题标题】:How to store a queryset in django session for pagination如何在 django 会话中存储查询集以进行分页
【发布时间】:2014-06-29 01:43:36
【问题描述】:

在 Django 1.6 中,我有一个模型存储在我的数据库中,我正在查询它以获取一些结果。然而,由于结果有时可能足以填满一页,我正在尝试严格按照这篇文章的框架实现分页系统:https://stackoverflow.com/a/18106904/178728

现在request.session 中的问题是我需要存储我的查询集而不仅仅是普通值。然而,这会产生各种问题,因为 Django 抱怨我的查询集不是 json 可序列化的。

到目前为止,我已经尝试过:

1) request.session['data'] = myQueryset # Fails
2) request.session['data'] = serializers.serialize('json', myQueryset) 
   # succeeds at first but fails in deserialization as
   # I can't reassemble the original queryset 

无论如何,我的问题是:存储然后检索我的查询集的最简单方法是什么?

请注意,当用户使用 POST 请求搜索数据库时,我需要存储查询集,然后通过 GET 检索结果以在分页器中使用。

提前致谢。

【问题讨论】:

标签: python json django pagination django-queryset


【解决方案1】:

我刚刚找到了解决问题的方法:这正是我想要的:https://gist.github.com/bsnux/4672788

import pickle

# Session key
key = 'my_qs'

# Pizza => model example
qs = Pizza.objects.filter(ingredient='tomato')
# Dumping data
request.session[key] = pickle.dumps(qs.query)

# Loading data
pizzas = Pizza.objects.all()[:1]
pizzas.query = pickle.loads(request.session[key])

# Using qs
for pizza in pizzas:
print(pizza.ingredient)

希望这对将来的某人有所帮助。干杯。

【讨论】:

  • 附注:普遍认为泡菜不安全并会带来安全风险。
  • @radev 是的。但是,在我的情况下,所有数据都来自 html select 框,这些框首先由我的数据库填充。我觉得挺安全的。不过,如果您有任何替代方案可以建议,请随时发布您的解决方案。
【解决方案2】:

试试

myQueryset.values()

它应该返回 JSON 可序列化的查询集。

【讨论】:

  • 如果我这样做,我会得到一个 ValuesQuerySet,这似乎不起作用。
猜你喜欢
  • 2010-12-30
  • 2014-01-31
  • 1970-01-01
  • 2017-06-02
  • 2017-01-14
  • 2013-12-05
  • 1970-01-01
  • 2012-01-23
  • 2023-03-03
相关资源
最近更新 更多