【发布时间】:2014-09-12 06:23:50
【问题描述】:
我有一个包含多种问题类型(即简答、多项选择)的测试设置。这些测试可以动态创建。我现在要做的是创建一个函数来为测试做出适当的响应集。我的模型是这样设置的:
class Test(models.Model):
pass
class Question(models.Model):
question = models.TextField()
test = models.ForeignKey(Test)
class NumQ(Question):
pass
class TextQ(Question):
pass
class Response(models.Model):
test = models.ForeignKey(Test)
class Answer(models.Model):
pass
class NumA(Answer):
question = models.ForeignKey(NumQ)
answer = models.IntegerField(blank=True, null=True)
class TextA(Answer):
question = models.ForeignKey(TextQ)
answer = models.TextField(blank=True, null=True)
我正在创建一个函数来创建一个响应,在该函数中我循环遍历测试的所有问题并创建新的答案。但是,我想创建正确类型的答案。我发现我可以使用django-model-utils 获得实际的问题类型,但是由此,我可以弄清楚如何创建正确答案类型的唯一方法是使用一堆 if/elif 语句,这真的很难看(尤其是因为有超过 2 种问题类型)。
此时我能想到的最佳选择是为每个问题添加一个 answer_type 字段,但我不确定如何将该字段(CharField 或自定义 TypeField)转换为实际生成一个新对象,并为其赋予正确的表观类型 (Answer)。我想我可以使用eval,但这似乎是一个非常丑陋的解决方案。 (在这种情况下,我什至不需要额外的字段;我可以将 Q 替换为类型中的 A。)但是在这种情况下,有没有更好的替代 eval 的方法?
【问题讨论】:
-
为什么你需要
TextField以外的任何东西,即使答案是数字,因为你收到用户的所有输入作为文本? -
TextQ 和 NumQ 只是示例。我有更复杂的问题类型,例如多项选择,但为了一个简单的示例,我只选择了 2 个没有其他模型依赖关系的问题类型。
-
最简单的解决方案是简单地创建一个字典,将答案类型名称映射到其未绑定的类类型,例如:{
'NumA':NumA,...}.但是这本字典很可能存在于 Django 的某个地方。不过,我似乎无法在文档中找到它。 -
您是否建议使用现有字典添加字典?这本词典究竟是如何使用的?
-
使用您的
aswer_type字段。您实际上是在做您对eval所做的事情,但要保护输入。但是,为什么你需要这样做呢?你能不能简单地从Question模型中创建一个ForeignKey到Answer模型中,我假设它是多态加载的?我想我不明白在什么情况下会在没有Answer的情况下创建Question,或者在创建Question而不是实际的Answer时会知道Answer的类型。