Django根据当前对象类型创建新对象

时间:2014-07-21 16:43:52

标签: python django types

我有一个具有多种问题类型的测试设置(即简答,多选)。可以动态创建这些测试。我现在要做的是创建一个函数来为测试做出适当的响应集。我的模型设置如下:

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

2 个答案:

答案 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)
  1. 问题可以有多个答案(针对多项选择题)。
  2. 每个测验可以有多个问题。
  3. 每次尝试都会记录学生,测验和答案。
  4. 结果包含问题的链接以及为一个测验输入的响应。
  5. 对于每个答案,您都有一个标签(显示在表单上),一个名称(供您自己参考)和一个值(此答案的键/重量/分数) - 这通常用于加权测验。 / LI>

    我认为这样做会让你的模型保持足够的灵活性。您唯一的问题是如何正确地绘制表格,我建议您使用FormWizard并创建自己的自定义表单。