Django 抽象模型与常规继承

2023-11-23

除了语法之外,使用 django 抽象模型和使用 django 模型的普通 Python 继承有什么区别?优点和缺点?

更新:我认为我的问题被误解了,我收到了关于抽象模型和继承自 django.db.models.Model 的类之间差异的回复。我实际上想知道从 django 抽象类(元:abstract = True)继承的模型类和从“object”(而不是 models.Model)继承的普通 Python 类之间的区别。

这是一个例子:

class User(object):
   first_name = models.CharField(..

   def get_username(self):
       return self.username

class User(models.Model):
   first_name = models.CharField(...

   def get_username(self):
       return self.username

   class Meta:
       abstract = True

class Employee(User):
   title = models.CharField(...

我实际上想知道模型类之间的区别 继承自 django 抽象类(Meta:abstract = True)和 普通的 Python 类继承自“object”(而不是 模型.模型)。

Django只会为子类生成表models.Model,所以前者...

class User(models.Model):
   first_name = models.CharField(max_length=255)

   def get_username(self):
       return self.username

   class Meta:
       abstract = True

class Employee(User):
   title = models.CharField(max_length=255)

...将导致生成一个表,类似于...

CREATE TABLE myapp_employee
(
    id         INT          NOT NULL AUTO_INCREMENT,
    first_name VARCHAR(255) NOT NULL,
    title      VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

...而后者...

class User(object):
   first_name = models.CharField(max_length=255)

   def get_username(self):
       return self.username

class Employee(User):
   title = models.CharField(max_length=255)

...不会导致生成任何表。

您可以使用多重继承来做这样的事情......

class User(object):
   first_name = models.CharField(max_length=255)

   def get_username(self):
       return self.username

class Employee(User, models.Model):
   title = models.CharField(max_length=255)

...这将创建一个表,但它将忽略中定义的字段User类,所以你最终会得到一张像这样的桌子......

CREATE TABLE myapp_employee
(
    id         INT          NOT NULL AUTO_INCREMENT,
    title      VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 抽象模型与常规继承 的相关文章