【问题标题】:Django model be related to objects of different typesDjango模型与不同类型的对象相关
【发布时间】:2021-04-15 20:40:24
【问题描述】:

我有一个名为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() 来获取分配实例的所有问题,例如,如上所述

【问题讨论】:

标签: django django-models django-rest-framework django-views django-forms


【解决方案1】:

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

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=...

?通过这种方式,您可以访问特定作业的不同类型的问题。 (另见ManyToMany Relationships. Returning fields in def __str__ method

正如我在评论中提到的那样,此解决方案的另一个解决方案/集成是使用 through_field。这取决于你想要实现的目标和你所处的场景。

【讨论】:

  • 这种方法的问题是我需要单独获取每个问题类型。我希望能够做一个assignment1,questions.all() 并以单个查询集列表的形式一次性获取与该作业相关的所有问题
  • 查看更新的答案(未经测试)。它有帮助吗?调用分配对象时,您将获得问题列表。
  • 不幸的是,没有。不过还是感谢您的尝试
  • 我想我只需创建一个 Question 模型并为它们提供类型(如选择字段)。最好是降低复杂度
猜你喜欢
  • 1970-01-01
  • 2015-10-26
  • 2012-03-30
  • 1970-01-01
  • 2016-04-16
  • 2016-06-05
  • 2014-01-16
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多