如何在django数据库模型中使用超类型?
我的数据库中有下一个模型<代码>问题表示一个问题和一个与之相关联的投票,如何在django数据库模型中使用超类型?,django,database,django-models,django-orm,Django,Database,Django Models,Django Orm,我的数据库中有下一个模型问题表示一个问题和一个与之相关联的投票,TextPollQuestion在问题前面有一个文本,Answer包含一个答案文本和问题的链接,UserAnswers保存用户的答案: class Question(models.Model): question_text = models.CharField(max_length=200) poll = models.ForeignKey(Poll, null=True, blank=True) user_
TextPollQuestion
在问题前面有一个文本,Answer
包含一个答案文本和问题的链接,UserAnswers
保存用户的答案:
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)
有了这段代码,我必须创建另一个子类型的
Answer
,UserAnswers
和一些连接到Question
模型的其他模型,以便将它们与TextPollQuestion
模型一起使用,但这显然违反了DRY原则。为了将所有模型链接到某个超类型的Question
和TextPollQuestion
并避免重复模型,我应该使用什么?关于问题的标题
Django在编写模型时有3种主要的子类化“模式”
请记住,您定义的每个模型,除非是“抽象”、“非托管”或“代理”,都会导致Django ORM在DB中为其创建一个表。我认为这并不违反DRY原则。您的问题和答案千差万别,没有太多抽象。定义模型时需要小心:请记住,创建模型类不仅仅是创建类,还创建了一个额外的数据库表。您的模型应该在设计时考虑数据库模式,而不是考虑枯燥的原则。如有必要,您可以使用抽象模型使其更加干燥。