django抽象模型与常规继承

发布于 2021-01-29 19:35:32

除了语法之外,使用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(...
关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    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)
    );
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看