Skip to content

扩展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)

Released under the Apache 2.0 License.