Django目前支持两种不同的继承方式,包括抽象基础类和多表继承。
1、抽象基础类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class Author(models.Model): name = models.CharField(max_length = 20 ) class Book(models.Model): title = models.CharField(max_length = 100 ) num_pages = models.IntegerField() authors = models.ManyToManyField(Author) def __str__( self ): return self .title class Meta( object ): abstract = True class SmithBook(Book): def __init__( self , * args, * * kwargs): super ( self ,Book).__init__( * args, * * kwargs) authors = models.ManyToManyField(Author,limit_choices_to = { "name_endswith" : "Smith" }) |
这里的关键是Meta嵌套类中的abstract=True,它指明了Book是一个基类。使用抽象基础类的方法,不会为基础类创建表。
在子类中的嵌套类Meta会继承或是和基类中的Meta合并起来。
attention:在SmithBook类中想要“重写”Book中的authors会出现错误,因为Django并不像python一样支持覆盖基类field的机制,但是我们可以通过在__init__方法中操作来达到同样的效果。
2、多表继承:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Author(models.Model): name = models.CharField(max_length = 20 ) class Book(models.Model): title = models.CharField(max_length = 100 ) num_pages = models.IntegerField() authors = models.ManyToManyField(Author) def __str__( self ): return self .title class SmithBook(Book): def __init__( self , * args, * * kwargs): super ( self ,Book).__init__( * args, * * kwargs) authors = models.ManyToManyField(Author,limit_choices_to = { "name_endswith" : "Smith" }) |
多表继承和抽象基础类从表面上来看,只是在Meta嵌套类中没有了abstract=True,但是在底层是有比较大的区别的。
对于抽象基础类来说,Book是不能实例化的,而多表继承中的Book是可以实例化的。而且两者在数据库中创建的表也是不同的。
参考博客https://www.cnblogs.com/lazyzhong/p/3490646.html