如何在django数据库模型中使用超类型?

时间:2015-12-30 17:58:57

标签: django database django-models django-orm

我的数据库中有下一个模型。 Question代表一个问题和一个与之关联的投票,TextPollQuestion在问题前有文字,Answer包含答案文字和问题链接,UserAnswers包含用户&# 39;答案:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    poll = models.ForeignKey(Poll, null=True, blank=True)
    user_answers = models.ManyToManyField(UserProfile, through='UserAnswers')

class TextPollQuestion(Question):
    text = models.CharField(max_length=450)

class Answer(models.Model):
    answer_text = models.CharField(max_length=100)
    question = models.ForeignKey(Question, null=True, blank=True)

class UserAnswers(models.Model):
    question = models.ForeignKey(Question)
    user = models.ForeignKey(UserProfile)
    answer = models.CharField(max_length=40)

使用此代码,我必须创建另一个AnswerUserAnswers的子类型以及连接到Question模型的其他一些模型,以便将它们与TextPollQuestion模型一起使用,但很明显违反DRY原则。我应该使用什么来将所有模型链接到QuestionTextPollQuestion的某些超类型并避免重复模型?

1 个答案:

答案 0 :(得分:1)

关于你问题的标题......

Django有3个主要"模式"用于编写模型时的子类化。

  1. Abstract model。抽象模型的主要用途是为您节省一些编码时间。比方说,你在几个相同的模型中有一些fiels。您定义了一个定义此字段并使其成为抽象的模型类。然后定义其他模型类,它们应该包含这些字段,并使它们成为抽象模型的子类。这样抽象模型本身并没有得到一个单独的数据库表,但每个子类(除非它是抽象的)得到它自己的表,其中包含抽象模型中定义的字段。请点击链接了解更多详情。
  2. Common model inheritance (Multi-table inheritance)。当一个模型扩展另一个模型中表示的数据时,通常会使用此方法。比如,你有一个定义基本数据的模型,需要有更多细节的模型,很少使用。即model"用户"使用字段"用户名","密码"和模型"配置文件"与田地"年龄","性别"为每个用户。然后你可以定义"用户"模型和定义"简介"作为它的子类。这将导致创建2个单独的表 - " User"和"简介"并通过Django ORM隐式地通过One-To-One关系链接。它几乎与您自己定义两个单独的模型而没有继承并添加" OneToOne"连接它们的领域。
  3. Proxy model。当您需要在现有模型上具有某些与已为其定义的行为不同的特殊行为时,通常会使用此方法。这样你就有了一些原始模型,然后再定义一个模型,使其成为原始的子类,并声称它是" proxy"。然后,您可以重新定义此子类上的任何行为。这将导致在原始模型的DB中只创建一个表格,而访问此表格时,您将能够使用这两个模型。
  4. 请记住您定义的每个模型,除非它"抽象","非托管"或" proxy",将导致Django ORM在DB中为其创建表。