如何在 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 是的。但是,在我的情况下,所有数据都来自 htmlselect
框,这些框首先由我的数据库填充。我觉得挺安全的。不过,如果您有任何替代方案可以建议,请随时发布您的解决方案。【参考方案2】:
试试
myQueryset.values()
它应该返回 JSON 可序列化的查询集。
【讨论】:
如果我这样做,我会得到一个ValuesQuerySet
,这似乎不起作用。以上是关于如何在 django 会话中存储查询集以进行分页的主要内容,如果未能解决你的问题,请参考以下文章