设计具有各种问题类型的测验网站。我有一个测验模型类,然后将为每个问题类型提供不同的模型。如下所示:
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()
。
这似乎是一个常见问题。设计这些相关模型的最佳方法是什么?有共同的技术吗?非常感谢!
答案 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 = ...
然后您需要确保有编辑选项来内联编辑响应。