【问题标题】:Pivot Table for Wagtail Form Builder for Polling and Votes purpose用于投票和投票目的的 Wagtail Form Builder 的数据透视表
【发布时间】:2021-12-27 02:41:26
【问题描述】:

我正在尝试将 Wagtail Form Builder 用于 投票和投票 目的,并使用 HighCharts 在网页上以交互方式显示结果.

问题在于 Wagtail FormSubmission 类只存储每次投票的信息。

| vote user | question 1 | question 2 |
| jason     | A          |  C         |
| lily      |   D        |   B        |

但我想获得以下信息: 有多少用户分别为问题 1、2 投票给 A、B、C、D,以及这些用户是什么。类似于为 FormSubmission 结果创建数据透视表。

我知道我可以执行 QuerySet API Aggregation 来获得我想要的,但我不想在每次用户访问网页时都进行 expensive 操作。

我正在考虑使用class-level 属性来实现这一点。

问:我想知道将这些聚合结果存储在数据库中并在每次提交投票时进行相应更新的最佳做法是什么?

【问题讨论】:

    标签: wagtail


    【解决方案1】:

    Wagtail 表单生成器并不真正适合此任务。它旨在允许非程序员为简单的数据收集构建表单——只需要存储和检索它,无需进一步处理——而无需知道如何定义 Django 模型。为了实现这一点,所有数据都以 JSON 文本的形式存储在 FormSubmission 模型中的单个字段中,以便可以将同一模型重用于任何表单。由于这不是数据库引擎本机理解的格式,因此无法有效地对其执行复杂查询 - 唯一的方法是单独解压缩每个提交并在 Python 代码中对其进行计算,这样效率会降低比任何查询集功能。

    相反,我建议为此编写一个自定义 Django 应用程序。 The tutorial in the Django documentation 是一个民意调查应用程序,它应该可以让您了解如何去做,但简而言之,您很可能需要三个模型:一个包含每个问题文本的 Question 模型,一个 AnswerChoice 模型,其中每个item 是一个问题的可能答案之一,并且是一个响应模型,指示给定用户选择了哪个 AnswerChoice。使用这些模型,您将能够使用如下查询集表达式执行查询,例如“有多少用户对问题 1 回答了 A”:

    Response.objects.filter(question=1, answer_choice='A').count()
    

    【讨论】:

    • 感谢您的回复。由于这种投票和投票功能不常用(尽管数据分析和可视化将是我网站的主要任务),我不愿意为此创建一个单独的应用程序。我可能会有一个专门的 Python 代码来满足通用统计要求,不仅用于这次投票和投票,还用于其他数据分析。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2019-04-03
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多