首页 > 解决方案 > 在 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?谢谢!!

标签: djangopostgresql

解决方案


在 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)

推荐阅读