【问题标题】:Persistent object with Django?Django的持久对象?
【发布时间】:2015-02-18 00:06:46
【问题描述】:

所以我有一个基于每个用户的网站,它预计会查询一个非常大的数据库,并翻阅结果。由于返回的条目数量的大小,我运行一次查询(这需要一些时间......),将结果存储在全局中,然后让人们根据需要遍历结果(或下载它们)。

当然,这是不可扩展的,因为全局变量是跨会话共享的。在 Django 中执行此操作的正确方法是什么?我查看了会话管理,但我总是遇到“xyz 在 json 上不可序列化”的问题。我是否要研究如何使用会话正确执行此操作,或者是否有其他首选方法可以执行此操作?

【问题讨论】:

  • 为什么不使用缓存层? Memcached、redis 等
  • 每个人的查询都一样吗?
  • 您可以使用数据库作为缓存层 - 获取初始“艰苦工作”查询的结果并将它们保存在新表中......然后从该表中检索结果会很快并且您仍然可以通过 SQL/ORM 进一步过滤它们,如果您使用单独的缓存层(并且也避免了整个序列化问题),您会放弃这一点
  • 您还应该考虑到 Django ORM 在您运行查询时不会抓取所有行(除非您通过执行list(queryset) 之类的操作来强制它抓取)它将使用游标并从遍历查询集时的数据库

标签: python json django mysql-python


【解决方案1】:

如果用户正在浏览结果,您可能不想拉回并渲染任何其他内容。大多数 SQL 方言都有 TOPLIMIT 子句,只要您的数据顺序一致,您就可以拉回有限范围的结果。 Django 的 Pagination 类是 Django 模型类之上的一个很好的抽象:https://docs.djangoproject.com/en/dev/topics/pagination/

我会小心在用户会话中存储大量数据,因为它不会随着用户数量的增长而扩展,并且用户会话可能会在用户离开网站后保留一段时间。如果您设置了此选项,请确保您阅读了有关清除过期会话的信息。 Django 不会为你做这件事: https://docs.djangoproject.com/en/1.7/topics/http/sessions/#clearing-the-session-store

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2011-12-25
    • 2012-10-05
    • 1970-01-01
    • 2011-05-07
    • 2021-04-05
    • 2011-12-14
    相关资源
    最近更新 更多