要点:
寻找一种将数据保存到动态生成关联表单的Django模型的好方法。
详情:
我一直在为创建由模型支持的动态Django表单的最佳方法感到困惑。例如,我想创建一个界面,用户可以在其中创建HTML表单,动态自定义该表单中的字段类型(数字,字符串,下拉框,日期等),然后将该表单显示给其他用户,以便这些用户可以提交保存到数据库的数据。我不确定如何制作一种有效的方法来保存数据。
www.formsite.com和www.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方法对这类事情最有效吗?是否存在某种有意义的渲染或缓存?
我一直遇到这样的情况:从这样的动态表单中保存数据会非常有用。我想知道其他人的方法是什么。任何建议都非常感谢。感谢您阅读这个长期存在的问题。
乔
答案 0 :(得分:1)
对于关系数据库,可以使用实体 - 属性 - 值模型(EAV)来实现动态或开放模式。关系数据库并不适合这种类型的模式,这通常会导致查询速度非常慢。 NoSQL有自己的一系列问题,但我认为它最适合您的要求。如果你决定采用这条路线,你可以看看MongoDB。我没有广泛使用它,但它似乎与关系数据库最相似,而不是其他NoSQL数据库,它的python接口看起来非常类似于django的ORM。我记得为Django找到了一个很好的EAV示例。虽然我现在不记得在哪里。