当前位置:实例文章 » Python实例» [文章]【Python】【进阶篇】35、Django Model三种继承模型详解

【Python】【进阶篇】35、Django Model三种继承模型详解

发布人:shili8 发布时间:2023-05-14 06:40 阅读次数:34

在 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 中三种继承模型的详细介绍,不同的继承模型可以满足不同的需求,使用时需要根据具体情况进行选择。

相关标签:

免责声明

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱290110527@qq.com删除。

其他信息

其他资源

Top