Упрощенная реализация EAV, похожая на форму Google - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь реализовать проект, похожий на формы Google. У нас есть несколько ActivityType (аналог формы Google). Например, домашняя проверка является ActivityType.

Каждый ActivityType может иметь несколько question. Как «Какой домашний адрес?», «Сколько соседей?». Каждый question может иметь разные type, например TextField, ChoiceField и т. Д.

Каждый ActivityType может иметь несколько представлений. Каждое представление может содержать ответы на некоторые или все вопросы в упражнении.

Как реализовать это наиболее логично и кратко?

Мой подход (и вопросы)

  • Используя администратор Django, можно определить несколько ActivityType.
  • Каждый ActivityType содержит несколько вопросов, используя StackedInline. Questions хранятся в виде массива json в самой модели ActivityType. Как показать массив JSON модели в StackedInline?
  • Модель Response содержит представления. Он просто содержит форму ForeignKey для ActivityType.
  • Response, которая должна быть отображена в соответствии со структурой, определенной массивом question JSON. Как использовать пользовательскую форму для этого?

Мой код

models.py

class ActivityType(models.Model):
    activity_name = models.CharField(max_length=200)
    questions_json = JSONField()

class ActivityAnswers(models.Model):
    activity_event = models.ForeignKey("ActivityEvent", on_delete=models.SET_NULL)
    user = models.ForeignKey(User, on_delete=models.SET_NULL)
    answers = JSONField()

forms.py

class ActivityTypeQuestionForm(forms.ModelForm):
    Q_TYPES = (
        ('multiple_choice', 'Multiple Choice'),
        ('text_field', 'Text Field'),
        ('integer_field', 'Integer Field'),
    )
    question_name = forms.CharField(max_length=200)
    question_type = forms.ChoiceField(choices= Q_TYPES)

class Meta:
    model = ActivityType
    exclude = []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...