django - 在 Django 模型中存储问卷的答案
问题描述
我有一个 django 模型,它应该存储用户对问卷的回答。有许多类型的问卷,但可以像这样简单(但许多更复杂):
What is your name?
What is your age?
What is your height?
What is your age?
我想知道如何创建一个模型来存储表单中提交的数据。现在,我正在使用这样一个简单的 JSON 字段:
from django.contrib.postgres.fields import JSONField
data = JSONField(default=dict)
然而,当问卷变得更长时,这变得很困难。最好的方法是什么?如果 JSON 字段是最好的方法,假设可能存在不同类型的问题(输入字段、多项选择等),我应该如何构建 json?谢谢!!
解决方案
在 postgres 中处理 JSONField 时,要记住的主要是磁盘空间。因为,在 JSON 中,我们必须同时存储键和值,而普通字段已经定义了键,我们不必将它存储在每一行中。所以基本上你可以优化的是关键,我认为它可以是问题编号的 id 而不是完整的问题。
基本上,您可以有如下问题模型:
Question(models.Model):
content = models.CharField(max_length=100)
你可以让你的 JSON 数据如下:
{
<question_id_1> : "Answer 1",
<question_id_2> : "Answer 2"
}
这将节省大量空间,虽然您必须在获取数据后进行映射,但它对您的数据库的压力会更小,效率更高。由于您没有固定类型的答案类型,您可以将值保存在 JSON 中,然后根据 question_type 推断其含义,例如答案值是多选答案字段的 id 值还是只是一个句子作为答案. 为此,您可以有一个有问题的类型字段,这将在获取结果后帮助您。
您可以做的另一件事是将其存储在 JSON 字段中,而不是存储在 JSON 字段中,您可以有一个不同的表,您可以在其中有外键问题,如下所示:
Answer(models.Model):
question = models.ForeignKey("Question", on_delete=models.CASCADE, related_name="answers")
content = models.CharField(max_length=200)
推荐阅读
- python - 零以下的一行出错,如何找到对应的正数?
- node.js - 无法读取属性订阅和错误上下文
- python - 使用 Altair 对标准化堆积条形图进行排序
- android - Firestore 反序列化未知枚举类型
- mysql - 从命令行优化 MySQL 查询
- flutter - 是否可以在颤振应用程序中打开网页?
- javascript - 我想用 nodejs(js) 任何文档操作 xls 文件而不是 xlsx
- reactjs - Azure AD 身份验证 - NextJS
- python - Python:如何将 Pandas Dataframe 行值转换为单个列?
- tfs - 如何通过测试和反馈扩展捕获自定义工作项类型的错误类别?