Резюме:
В поисках хорошего способа сохранения данных в моделях Django, для которых связанные формы генерируются динамически.
Detail:
Я ломал голову над лучшим подходом к созданию динамических форм Django на основе моделей. Например, я хотел бы создать интерфейс, в котором пользователь может создавать HTML-форму, динамически настраивать типы полей в этой форме (число, строка, выпадающий список, дата и т. Д.), А затем отображать эту форму для других пользователи, чтобы эти пользователи могли отправлять данные, которые сохраняются в базе данных. Я не уверен, как сделать эффективный подход к сохранению данных.
www.formsite.com и www.mailchimp.com имеют некоторые инструменты для создания форм, которые являются хорошим примером того, что я пытаюсь сделать. У Джейкоба Каплана-Мосса превосходное учебное пособие о том, как создавать формы динамически, но учебное пособие не раскрывает, как сохранить данные.
В качестве фиктивного примера, один (возможно, плохой?) Подход может заключаться в создании некоторых моделей, как показано ниже, где есть таблица базы данных для 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)
Есть ли лучший подход к сохранению данных на основе динамических форм? Должен ли я каким-то образом преобразовывать ответ респондента формы в какой-то формат с сортировкой и сохранять его в TextField (вместо 10 записей SurveyQuestionResponse будет одна запись со всеми значениями ответа, собранными вместе)? Я не слишком знаком с опциями NoSQL, но подойдет ли подход NoSQL лучше для такого типа вещей? Есть ли какой-то рендеринг или кеширование, которые имеют смысл делать?
Я продолжаю сталкиваться с ситуациями, когда сохранение данных из динамических форм, таких как это, было бы очень полезно. Мне интересно, каковы подходы других людей. Любой совет высоко ценится. Спасибо за чтение этого по общему признанию длинного вопроса.
Джо