В поисках хорошего подхода к сохранению данных, представленных с помощью динамических форм Django - PullRequest
1 голос
/ 22 апреля 2011

Резюме:

В поисках хорошего способа сохранения данных в моделях 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 лучше для такого типа вещей? Есть ли какой-то рендеринг или кеширование, которые имеют смысл делать?

Я продолжаю сталкиваться с ситуациями, когда сохранение данных из динамических форм, таких как это, было бы очень полезно. Мне интересно, каковы подходы других людей. Любой совет высоко ценится. Спасибо за чтение этого по общему признанию длинного вопроса.

Джо

1 Ответ

1 голос
/ 22 апреля 2011

Для реляционной базы данных модель Entity-attribute-value (EAV) может использоваться для создания динамической или открытой схемы. Реляционные базы данных не очень подходят для этого типа схемы, и это обычно приводит к очень медленным запросам со временем. У NoSQL есть свой набор проблем, но я думаю, что он лучше всего подходит для ваших требований. Если вы решите пойти по этому пути, вы можете взглянуть на MongoDB. Я не использовал его широко, но кажется, что он больше похож на реляционную базу данных, чем на другие базы данных NoSQL, а его интерфейс на python кажется довольно похожим на ORM в django. Я помню, как нашел хороший пример EAV для Django. Хотя я не помню, где сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...