如何在 django 会话中存储查询集以进行分页

Posted

技术标签:

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

在 Django 1.6 中,我有一个模型存储在我的数据库中,我正在查询它以获取一些结果。然而,由于结果有时可能足以填满一页,我正在尝试严格按照这篇文章的框架实现分页系统:https://***.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 检索结果以在分页器中使用。

提前致谢。

【问题讨论】:

你为什么不用这个docs.djangoproject.com/en/dev/topics/pagination/…? @zymud 因为这个:***.com/a/2266950/178728 @zymud 加上 POST 仅在用户第一次提交其表单时出现,这是我唯一一次可以通过 POST 检索值。然而,分页通过GET 工作,这意味着我需要将用户的搜索存储在某处。 【参考方案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,这似乎不起作用。

以上是关于如何在 django 会话中存储查询集以进行分页的主要内容,如果未能解决你的问题,请参考以下文章

在.net中,大数据量下的列表显示分页如何处理?

Django:保存旧的查询集以供将来比较

Flask-SQLAlchemy中的分页操作

过滤 Django 查询集以获取 dict 值

不是预期的 django 查询集响应

存储结果集以供以后获取