扩展Django model
抽象模型类
创建抽象模型类,继承自Django的Model类,并定义抽象模型类中的属性。 操作步骤: 1.将公共字段和方法提取到一个新的基类中。 2.在这个基类的 Meta类里设置abstract = True。 3.让原来的模型继承这个抽象基类。 4.不同的子类可以根据需要添加自己的字段。
基类的属性可以有:
- 创建时间、修改时间、删除时间
- 创建人、修改人、删除人
- 表描述
python
from django.db import models
# 将公共字段抽象出来
class BaseModel(models.Model):
name = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True # 关键:标记为抽象基类,不生成数据表
ordering = ['-created_at']
def __str__(self):
return self.name继承抽象模型类的模型类
创建普通模型类,继承抽象模型类,并定义普通模型类中的属性。
python
class Product(BaseModel):
price = models.DecimalField(max_digits=10, decimal_places=2)
# 自动拥有 name, created_at, updated_at 字段剔除不需要的扩展属性
如果不需要部分扩展属性,可以进行如下处理。
python
class Category(BaseModel):
updated_at = None
description = models.TextField()
# 自动拥有 name, created_at 字段,但没有 updated_at重定义扩展属性
如果子类中定义的字段与基类字段同名,子类字段会覆盖基类字段
python
class Product(BaseModel):
price = models.DecimalField(max_digits=10, decimal_places=2)
# 自动拥有 name, created_at, updated_at 字段
class Meta:
ordering = ['name']
# 覆盖排序field引用抽象模型类
例如将基类放在 django_project/utils/models.py 文件中,可以全局引用
python
from django.db import models
# 将公共字段抽象出来
class BaseModel(models.Model):
name = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True # 关键:标记为抽象基类,不生成数据表
ordering = ['-created_at']
def __str__(self):
return self.name在其他的模型中继承BaseModel
python
from uitils.models import BaseModel
class User(BaseModel):
username = models.CharField(max_length=100)