将扫描文本中的数据导入Django作为YAML fixture或SQL

时间:2011-10-06 01:39:16

标签: python django fixture

我正在设置一个简单的Django应用程序 - 一个测验。问题和答案来自已扫描,OCR和解析的打印样本测试。我已将它们解析为Python对象,如下所示:

class Quiz(object):
    def __init__(self, name):
        self.name = name
        self.questions = {}
class Question(object):
    def __init__(self, text):
        self.text = text
        self.answers = {}
class Answer(object):
    def __init__(self, text, value= -1.0, explanation=""):
        self.text = text
        self.value = value
        self.explanation = explanation

但我的Django模型,无法将“列表”作为模型字段使用外键来保持测验之间的关系 -

class Quiz(models.Model):
    name = models.CharField(max_length=256)
class Question(models.Model):
    quiz = models.ForeignKey(quiz)
    order = models.IntegerField()
    text = models.TextField()
class Answer(models.Model):
    question = models.ForeignKey(question)
    order = models.IntegerField()
    text = models.TextField()
    explanation = models.TextField()
    value = models.FloatField()

有人可以建议一种从前者到后者的简单方法吗?感谢。

1 个答案:

答案 0 :(得分:0)

问自己的第一个问题是你为什么要使用这些中间类?这听起来像糟糕的设计。

一旦我们走过了糟糕的设计。你的代码显示qustion.answers是一个字典而不是列表,我假设你刚刚写了一个错字。

如果您有测验模型实例,可以致电Quiz.question_set.all()以获取该测验的所有问题。这个调用的结果将是一个查询集,它是一个可迭代的对象,因此调用list(Quiz.question_set.all())会给你一个列表。

我无法强调,尽管你做错了,而且很可能只是在取消中间人。此外,PEP8命名规则是一个非常好的主意,即类的命名如下:

class Quiz(models.Model):
    ...

它会让你的生活更容易遵循惯例=)