首页 > 解决方案 > Django模型与不同类型的对象相关

问题描述

我有一个模型叫Assignment. 每个作业可以包含多个不同类型的问题。也就是说,作业可以有多项选择题、作文题、对错题。

每种问题类型都有自己的模型。当然,它们与 的分配有关ForeignKey

我如何将它们与作业相关联,以便获得所有(不同类型的)问题,例如,调用:

assignment1.questions.all()

我看过一些关于 GenericForeignKey、ContentType 等内容的文章,但我还没有让它们发挥作用。

像这样:

class Assignment(models.Model):
    # ...assignment fields

class MultipleChoiceQuestion(models.Model):
    assignment = models.ForeignKey(Assignment)


class TrueOrFalseQuestion(models.Model):
    assignment = models.ForeignKey(Assignment)

class EssayQuestion(models.Model):
    assignment = models.ForeignKey(Assignment)

因此,我可以通过执行来获取分配实例的所有问题assignment1.questions.all(),例如,如上所述

标签: djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-forms

解决方案


你为什么不做这样的事情:

class Assignment(models.Model):
  m_question = models.ManyToMany("MultipleChoiceQuestion")
  tf_question = models.ManyToMany("TrueOrFalseQuestion")
  e_question = models.ManyToMany("EssayQuestion")
  [...]
  def __str__(self):
     all_m_questions = ", ".join(str(q) for q in self.m_question.all())
        return "{},{}".format(self.type, all_m_questions) #etc...


class MultipleChoiceQuestion(models.Model):
  name=...

class TrueOrFalseQuestion(models.Model):
  name=...

class EssayQuestion(models.Model):
  name=...

? 通过这种方式,您可以访问特定作业的不同类型的问题。(另见多对多关系。在 def __str__ 方法中返回字段

该解决方案的另一个解决方案/集成是使用through_field我在评论中提到的 a 。这取决于想要实现的目标和您所处的场景。


推荐阅读