【问题标题】:How to structure Django models for multiple forms using a subset of a list of fields?如何使用字段列表的子集为多个表单构建 Django 模型?
【发布时间】:2018-10-20 23:49:17
【问题描述】:

我正在通过 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/on paper 来完成,但我不知道如何让它在 Django 中工作。如果FormAModel 有一个带有AllQuestionsModel 的ManyToMany 字段,它不能以这种方式选择性地只抓取适用于Form A 的问题,可以吗?

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

【问题讨论】:

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


    【解决方案1】:

    如果您尝试将所有问题放在一个模型中会怎样:

    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

    此外,如果更容易标记formsQuestions 未启用,请设置default=True 而不是default=False。祝你好运。

    【讨论】:

    • 这是一个不错的解决方案。你在哪里告诉它具有属性form_a = True的问题?在question_text的定义里面,作为参数? question_text = models.CharField(form_a = true)?
    • 没有。它是模型上的一个单独字段。渲染时它将显示为复选框。 question_text 将是您的问题。
    • 我忘了提到当你向考生展示你的问题时,你只需要显示Question.question_text,这样他们就看不到复选框了。
    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2012-03-09
    • 2020-11-30
    • 2019-04-23
    相关资源
    最近更新 更多