Django子类相关模型的替代方案

时间:2015-01-12 01:26:05

标签: django django-models

设计具有各种问题类型的测验网站。我有一个测验模型类,然后将为每个问题类型提供不同的模型。如下所示:

class Quiz(models.Model):
    creator = models.ForeignKey(User)
    description = models.CharField(max_length="50")
    date_created = models.DateTimeField()

class TextQuestion(models.Model): ...

class MultipleChoiceQuestion(models.Model): ...

我的第一个想法是让每个问题类型都成为一个Question模型类的子类。但是我已经读过2勺Django,具体的模型继承是一个坏主意。我可以在每个QuestionType子类中指向ForeignKey s指向测验,但这是限制性的。

似乎我必须单独查询每种类型,并且无法获得所有问题。在每个测验的视图中,我希望能够执行Quizvar.question_set.all()

之类的操作

这似乎是一个常见问题。设计这些相关模型的最佳方法是什么?有共同的技术吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

Django不能自动union来自不同sql表的对象。所以你必须有一些中间表(例如具体基础Question类)。

BTW,请看django-polymorphic

答案 1 :(得分:0)

仅仅因为某些东西通常是一个坏主意,并不意味着它总是一个坏主意。

在您的情况下,问题是用户希望专门管理的对象,因此将它们作为具体类可以正常工作,然后您可以在{{Quizvar.question_set.all()上执行查询:models.py 1}}设置如下:

class Quiz(models.Model):
    creator = models.ForeignKey(User)
    description = models.CharField(max_length="50")
    date_created = models.DateTimeField()

class Question(models.Model)
    question = models.CharField(max_length="50")
    quiz = models.ForeignKey(Quiz)

class TextQuestion(Question):
    pass
class MultipleChoiceQuestion(Question):
    pass

这样的方法有一些缺点/问题,例如数据库中会有一个Question表,可能会导致信息重复。此外,这意味着响应类型与问题的关系非常紧密,用户需要提前选好,并且如果需要,不能(轻松)从问题响应变为另一个。

另一种方法是使用相关的响应类型来生成一般问题,如下所示:

class Quiz(models.Model):
    creator = models.ForeignKey(User)
    description = models.CharField(max_length="50")
    date_created = models.DateTimeField()

class Question(models.Model)
    question = models.CharField(max_length="50")
    quiz = models.ForeignKey(Quiz)
    response = models.ForeignKey(Response)

class Response(models.Model):
    pass

class TextResponse(Response):
    length = ...

class NumberResponse(Response):
    minimum = ...
    maximum = ...

class MultipleChoiceResponse(Response):
    choices = ...

然后您需要确保有编辑选项来内联编辑响应。