【问题标题】:Django: Actions that provide intermediate pages ... with 100k rowsDjango:提供中间页面的操作......有 100k 行
【发布时间】:2025-12-23 06:15:06
【问题描述】:

我知道如何编写提供中间页面的操作,因为文档很棒:

https://docs.djangoproject.com/en/2.0/ref/contrib/admin/actions/#actions-that-provide-intermediate-pages

但是,如果我的选择包含 100k 行,则文档的模式不起作用,因为 URL 太长了。

如何编写提供中间页面并可以处理 +100k 行的 Django Admin Actions?

【问题讨论】:

  • 你不能在其他地方保存 id,例如会话还是数据库表?
  • @Alasdair 是的,我可以将 ID 保存在缓存或数据库中。但是写 100k 个 ID 开销很大。如果您可以只存储没有所有 ID 的 QuerySet SELECT 语句,那就太好了。
  • 在这种情况下,您最好的选择是使用发布数据。但是您不能通过重定向发布。所以你需要编写一个自动提交模板并传递数据。而不是做一个return HttpResponseRedirect("/export/?ct=%s&ids=%s" % (ct.pk, ",".join(selected))) 你将呈现一个模板,它会自动将数据提交到下一个url
  • @TarunLalwani 您的解决方案听起来不错。但我缺少一个部分:如何从 GET 数据创建查询集?这需要适用于 list_filter 和漂亮的 date_hierarchy 过滤器。
  • 您将在def export_as_json(modeladmin, request, queryset): 中获得查询集,您可以从中提取 id 并使用变量将其传递给模板

标签: django django-admin


【解决方案1】:

我是这样解决的:

  • Pickle QuerySets
  • 将腌制的 QuerySet 存储在随机 ID 下的缓存中
  • 将随机 ID 转发到下一页
  • 接下来的页面使用随机 ID 从缓存中读取 QuerySet。

【讨论】:

    【解决方案2】:

    当我需要更接近的东西时,我使用了一些分组变量,例如:allactiveaccepteddenied。通过进行这种分组,我可以对大量数据执行一些批量操作,而无需创建包含数千个 pk 的 python 列表。

    另一个需要注意的好点是您需要将其传递给数据库,否则您将在视图/模型上遇到巨大的瓶颈。

    【讨论】:

      最近更新 更多