【Python】【进阶篇】35、Django Model三种继承模型详解
在 Django 中,Model 是指对数据库表的定义,通过定义 Model,我们可以使用 Python 代码来创建、修改和查询数据库。
其中,Django 中有三种继承模型,分别是抽象基类继承、多表继承和代理模型继承。下面我将详细介绍这三种继承模型。
1. 抽象基类继承
抽象基类继承是指一个模型类继承自抽象基类,用于定义公共字段和方法。抽象基类不会对应数据库中的表,而是被其它模型类继承。
示例代码:
```python
from django.db import models
class BaseModel(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
abstract = True
class UserInfo(BaseModel):
name = models.CharField(max_length=20, verbose_name='姓名')
age = models.IntegerField(verbose_name='年龄')
```
在上述代码中,BaseModel 继承自 Django 的 Model 类,并且把它的 Meta 类中的 abstract 属性设置为 True,表示这个模型是一个抽象基类,并不会生成表。
UserInfo 继承了 BaseModel,因此拥有了 BaseModel 中定义的 create_time 和 update_time 字段,并且其它模型也可以继承 BaseModel。
2. 多表继承
多表继承是指一个模型类同时继承了多个表,其中一个父模型被称为基础模型,其它模型则是通过 ForeignKey 与基础模型关联起来的。
示例代码:
```python
from django.db import models
class BaseModel(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
abstract = True
class Person(BaseModel):
name = models.CharField(max_length=20, verbose_name='姓名')
age = models.IntegerField(verbose_name='年龄')
class Student(Person):
grade = models.CharField(max_length=20, verbose_name='班级')
```
在上述代码中,Person 继承自 BaseModel,拥有 create_time 和 update_time 字段,另外还定义了 name 和 age 两个字段。
Student 继承自 Person,因此会同时继承 BaseModel 和 Person 的字段,并且增加了一个 grade 字段。
在 Student 中,Django 会自动为其生成一个 Person_id 字段,用于与 Person 表关联。
3. 代理模型继承
代理模型继承是指一个模型类继承自其它模型类,并且与被继承的模型共享同一张表。代理模型只是对被继承的模型的一种扩展,不会添加新字段或数据。
示例代码:
```python
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名')
age = models.IntegerField(verbose_name='年龄')
class PersonProxy(Person):
class Meta:
proxy = True
```
在上述代码中,PersonProxy 继承自 Person,但是它的 Meta 类中设置了 proxy 属性为 True,表示这是一个代理模型。
Person 和 PersonProxy 共享一张表,PersonProxy 不会添加新字段或数据。但是,我们可以通过重写其方法来改变其行为,例如:
```python
class PersonProxy(Person):
class Meta:
proxy = True
def save(self, *args, **kwargs):
# 对 save 方法进行改写
super().save(*args, **kwargs)
# 其它逻辑
```
以上就是 Django 中三种继承模型的详细介绍,不同的继承模型可以满足不同的需求,使用时需要根据具体情况进行选择。