如何使用字段列表的子集为多个表单构建Django模型?

时间:2018-05-10 16:28:37

标签: django database-design django-models django-forms

我正在通过Django构建一个庞大而复杂的表单系统。它比我构建的任何形式都复杂,我有一些数据库设计背景但没有很多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,则无法选择性地仅抓取适用于表单A的问题,是吗?

编辑:我意识到这与Django用户权限非常相似(用户有角色,角色属于不同的用户),但Django已经建立了如何为不同的用户分配不同的权限以便更快地设置。我怎样才能将这个想法复制到一组不同的模型中呢?

1 个答案:

答案 0 :(得分:0)

如果您尝试将所有问题都放在一个模型中,该怎么办:

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=True而不是default=False。祝你好运。