寻求通过动态Django表单提交的持久数据的好方法

时间:2011-04-22 00:40:40

标签: django forms dynamic models

要点:

寻找一种将数据保存到动态生成关联表单的Django模型的好方法。

详情:

我一直在为创建由模型支持的动态Django表单的最佳方法感到困惑。例如,我想创建一个界面,用户可以在其中创建HTML表单,动态自定义该表单中的字段类型(数字,字符串,下拉框,日期等),然后将该表单显示给其他用户,以便这些用户可以提交保存到数据库的数据。我不确定如何制作一种有效的方法来保存数据。

www.formsite.comwww.mailchimp.com有一些表单构建工具,这些都是我想要做的很好的例子。 Jacob Kaplan-Moss有关于如何动态创建表单的excellent tutorial,但本教程没有讨论如何持久保存数据。

作为一个虚拟示例,一个(可能是坏的?)方法可能是创建一些类似下面的模型,其中有一个SurveyQuestions的数据库表(存储每个字段的可自定义名称和数据类型)和一个SurveyQuestionResponses(每个记录存储针对特定调查的SurveyQuestion的个人响应。)

然而,似乎这种方法可能导致非常复杂和缓慢的查询。例如,如果调查有10个问题,并且您希望显示10个用户对该调查的响应,则会有查询选择所有10个SurveyQuestions,然后对于每个调查响应者,将会有一个查询来选择每个SurveyQuestionResponses。似乎所需的查询数量可以加快!

class Survey(models.Model):
    # some fields here. 
    pass

class SurveyQuestion(models.Model):
    """ Defines the headings and field
        types for a given Survey. 
    """
    survey = models.ForeignKey(Survey)
    field_name = models.CharField(
        max_length=255, 
        help_text='Enter the name for this field heading')
    field_type = models.IntegerField(
        choices=choices.FIELD_TYPES,  
        help_text='Enter the data type for this field')
    display_order = models.IntegerField(default=0)

class SurveyQuestionResponse(models.Model):
    survey_field = models.ForeignKey(SurveyQuestion)
    response value = models.TextArea(blank=True, null=True)

是否有更好的方法来基于动态表单保存数据?我应该以某种方式将表单响应者的响应转换为某种pickle格式并将其存储到TextField(而不是有10个SurveyQuestionResponse记录,那么会有一条记录包含所有响应值一起腌制)?我对NoSQL选项不太熟悉,但是NoSQL方法对这类事情最有效吗?是否存在某种有意义的渲染或缓存?

我一直遇到这样的情况:从这样的动态表单中保存数据会非常有用。我想知道其他人的方法是什么。任何建议都非常感谢。感谢您阅读这个长期存在的问题。

1 个答案:

答案 0 :(得分:1)

对于关系数据库,可以使用实体 - 属性 - 值模型(EAV)来实现动态或开放模式。关系数据库并不适合这种类型的模式,这通常会导致查询速度非常慢。 NoSQL有自己的一系列问题,但我认为它最适合您的要求。如果你决定采用这条路线,你可以看看MongoDB。我没有广泛使用它,但它似乎与关系数据库最相似,而不是其他NoSQL数据库,它的python接口看起来非常类似于django的ORM。我记得为Django找到了一个很好的EAV示例。虽然我现在不记得在哪里。