我有一个具有多种问题类型的测试设置(即简答,多选)。可以动态创建这些测试。我现在要做的是创建一个函数来为测试做出适当的响应集。我的模型设置如下:
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)
我正在创建一个函数来创建一个Response,我在其中遍历测试的所有问题并创建新的答案。但是,我想创建正确的答案类型。我想通过django-model-utils我可以得到实际类型的问题,但是从中我可以弄清楚如何创建正确答案类型的唯一方法是使用一堆if / elif语句,这真的很难看(特别是因为有超过2种问题类型)。
此时我能想到的最佳选择是为每个问题添加answer_type
字段,但我不确定如何转换该字段(CharField
或自定义{ {1}})实际生成一个新对象,并给它正确的表观类型(TypeField
)。我想我可以使用Answer
,但这似乎是一个非常难看的解决方案。 (在这种情况下,我甚至不需要额外的字段;我可以用类型中的A替换Q.)但在这种情况下,是否有更好的替代eval
?
答案 0 :(得分:0)
我认为django-typed-models可以解决您的问题。
IE中。对于NumQ
,您需要设置answer_type='appname.numa'
,稍后在创建答案时,只需将type=answer_type
传递给答案构造函数。
不同的方法:如果您想获取模型类表单字符串,请使用get_model
中的函数django.db.models.loading
。
答案 1 :(得分:0)
class AnswerType(models.Model):
name = models.CharField(max_length=200)
value = models.CharField(max_length=200, blank=True, null=True)
label = models.CharField(max_length=200, blank=True, null=True)
class Question(models.Model):
title = models.CharField(max_length=300)
answer = models.ManyToManyField(AnswerType)
class Result(models.Model):
question = models.ForeignKey(Question)
reponse = models.CharField(max_length=300)
class Attempts(models.Model):
student = models.ForeignKey(User)
taken_on = models.DateTimeField(auto_now=True)
quiz = models.ForeignKey(Quiz)
answer = models.ManyToMany(Result)
class Quiz(models.Model):
title = models.CharField(max_length=300)
questions = models.ManyToManyField(Question)
results = models.ManyToManyField(Responses)
我认为这样做会让你的模型保持足够的灵活性。您唯一的问题是如何正确地绘制表格,我建议您使用FormWizard并创建自己的自定义表单。