用于投票和投票目的的Wagtail Form Builder的数据透视表



我正在尝试使用Wagtail Form Builder进行投票和轮询,并使用HighCharts在网页上交互式显示结果。

问题是WagtailFormSubmission类只存储每个投票的信息。

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

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

我知道我可以执行QuerySet API聚合以获得我想要的内容,但我不想每次用户访问网页时都执行expensive操作。

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

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

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

相反,我建议为此编写一个自定义的Django应用程序。Django文档中的教程是一个民意调查应用程序,它应该让你知道如何进行民意调查,但简而言之,你很可能需要三个模型:一个包含每个问题文本的问题模型,一个AnswerChoice模型,其中每个项目都是一个问题的可能答案之一,以及一个指示给定用户选择了哪个AnswerChoice的响应模型。使用这些模型,您将能够执行诸如";对于问题1"有多少用户回答了A;带有查询集表达式,例如:

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

最新更新