Как структурировать модели Django для нескольких форм, используя подмножество списка полей? - PullRequest
0 голосов
/ 10 мая 2018

Я строю большую, сложную систему форм через Джанго. Он более сложен, чем любая другая форма, которую я только что создал, и у меня есть некоторый опыт проектирования баз данных, но у меня нет большого опыта работы с Django.

Допустим, существует около 500 возможных вопросов и 6 различных типов форм. Около 75% вопросов являются общими для всех 6 форм, но остальные появляются на 1-5 из форм в различных, несколько перекрывающихся комбинациях (например, вопрос 20 появляется в формах A, B и D, но возникает вопрос 21 на формах B, C и D).

Возможные решения, которые я нашел до сих пор:

1) иметь одну модель, которая представляет собой все общие вопросы, а затем отдельную модель для каждого типа формы (A, B, C, D, E, F), которая наследует общие вопросы, а затем добавляет каждую вещь, которая не является общий. Недостатком этого является то, что существует избыточность между типами форм в некоторых полях (те вопросы, которые появляются в нескольких формах).

2) иметь одну таблицу / модель для всех 500 вопросов, а затем связать каждый тип формы с промежуточной таблицей, в которой указано, какие вопросы относятся к какому типу формы. Это кажется достаточно простым, чтобы сделать с сырым SQL / на бумаге, но я не могу понять, как заставить его работать в Django. Если FormAModel имеет поле ManyToMany с AllQuestionsModel, оно не может выборочно выбирать только те вопросы, которые относятся к Форме А, не так ли?

Редактировать: Я понимаю, что это очень похоже на полномочия пользователя Django (у пользователей есть роли, роли принадлежат разным пользователям), но Django разработал, как назначать разные разрешения различным пользователям, чтобы ускорить его настройку. Как мне повторить эту идею для другого набора моделей, которые становятся формами?

1 Ответ

0 голосов
/ 12 мая 2018

Что делать, если вы попытались поместить все свои вопросы в одну модель:

class Questions(models.Model):
    question_text = models.CharField(
        # parameters
        )
    form_a = models.BooleanField(
        default=False,
        help_text='Question is on Form "A" ',
        )
    form_b = models.BooleanField(
        default=False,
        help_text='Question is on Form "B" ',
        )
    form_c = models.BooleanField(
        default=False,
        help_text='Question is on Form "C" ',
        )
    form_d = models.BooleanField(
        default=False,
        help_text='Question is on Form "D" ',
        )
    form_e = models.BooleanField(
        default=False,
        help_text='Question is on Form "E" ',
        )
    form_f = models.BooleanField(
        default=False,
        help_text='Question is on Form "F" ',
        )

Тогда вы можете query вопросы, которые вы хотите:

form_a = Questions.objects.filter(form_a=True)

Или если вы хотите получитьБолее того, вы можете попробовать настроить пользовательские managers.

Кроме того, если легче отметить, что forms Questions не включено, вместо этого установите default=Truedefault=False.Удачи.

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