Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在django数据库模型中使用超类型?_Django_Database_Django Models_Django Orm - Fatal编程技术网

如何在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种主要的子类化“模式”

  • 。抽象模型的主要用途是为您节省一些编码时间。比如说,你有几个相同的模型。您可以定义一个模型类来定义此字段并将其抽象化。然后定义其他模型类,这些类应该包含这些字段,并使它们成为抽象模型的子类。这样抽象模型本身就不会得到一个单独的DB表,但每个子类(除非是抽象的)都会得到自己的表,其中包含在抽象模型中定义的字段。请按照链接了解更多详细信息
  • 。这通常在一个模型扩展另一个模型中表示的数据时使用。比如说,您有一个定义基本数据的模型,需要有一个包含更多细节的模型,而这些细节很少使用。即,模型“用户”带有“用户名”、“密码”字段,模型“个人资料”带有每个用户的“年龄”、“性别”字段。然后您可以定义“用户”模型,并将“概要文件”定义为它的子类。这将导致创建两个单独的表——“User”和“Profile”,并通过Django ORM隐式的一对一关系进行链接。这几乎与您自己定义两个独立的模型而不继承并添加连接它们的“OneToOne”字段是一样的
  • 。当您需要在现有模型上有一些与已经为其定义的行为不同的特殊行为时,通常会使用此方法。这样,您就有了一些原始模型,然后又定义了一个模型,使其成为原始模型的子类,并声称它是“代理”。然后您可以重新定义这个子类上的任何行为。这将导致在DB中仅为原始模型创建一个表,而要访问此表,您将能够使用这两个模型

  • 请记住,您定义的每个模型,除非是“抽象”、“非托管”或“代理”,都会导致Django ORM在DB中为其创建一个表。

    我认为这并不违反DRY原则。您的问题和答案千差万别,没有太多抽象。定义模型时需要小心:请记住,创建模型类不仅仅是创建类,还创建了一个额外的数据库表。您的模型应该在设计时考虑数据库模式,而不是考虑枯燥的原则。如有必要,您可以使用抽象模型使其更加干燥。