除了语法之外,使用django抽象模型和对django模型使用纯Python继承之间有什么区别?利弊?
更新:我认为我的问题被误解了,并且我收到了关于抽象模型与从django.db.models.Model继承的类之间的区别的答复。 我实际上想知道从django抽象类(Meta: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)继承的模型类和从“ object”(而不是models.Model)继承的普通Python类之间的区别。
Django只会为的子类生成表models.Model,因此前者…
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该类中定义的字段,因此最终将得到一个这样的表…
User
CREATE TABLE myapp_employee ( id INT NOT NULL AUTO_INCREMENT, title VARCHAR(255) NOT NULL, PRIMARY KEY (id) );