【后端】【djanog】【进阶】【models】自定义模型方法 (`Model Methods`)——封装业务逻辑

模型方法 (Model Methods)

Django 的 模型方法models.Model 类中的普通 Python 方法,主要用于 封装业务逻辑,让代码更加清晰、可复用。


(一)示例代码解析

python 复制代码
class Order(models.Model):
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)  # 订单总金额
    status = models.CharField(max_length=20, default='pending')  # 订单状态

    def is_paid(self):
        return self.status == 'paid'  # 判断订单是否已支付

    def mark_as_paid(self):
        self.status = 'paid'
        self.save(update_fields=['status'])  # 只更新 `status` 字段,提高效率

    def calculate_tax(self, tax_rate=0.1):
        return self.total_amount * tax_rate  # 计算税额(默认 10%)

(二)模型方法的作用

方法 作用 示例调用
is_paid() 判断订单是否已支付 order.is_paid()
mark_as_paid() 将订单标记为已支付并保存 order.mark_as_paid()
calculate_tax(tax_rate) 计算订单的税额 order.calculate_tax(0.15)

(三)模型方法的实际使用

1. 判断订单是否已支付

python 复制代码
order = Order.objects.get(id=1)
if order.is_paid():
    print("订单已支付")
else:
    print("订单未支付")

这样比直接写 if order.status == 'paid': 更清晰,可读性更强。


2. 标记订单为已支付

python 复制代码
order.mark_as_paid()
print(order.status)  # 输出: 'paid'
  • self.save(update_fields=['status']) 只更新 status 字段 ,比 save() 效率更高,减少数据库开销。

3. 计算订单的税额

python 复制代码
order = Order.objects.get(id=1)
tax = order.calculate_tax()  # 默认 10% 税率
tax_custom = order.calculate_tax(0.15)  # 自定义 15% 税率
print(f"税额: {tax}, 自定义税额: {tax_custom}")

(四)模型方法 vs. 自定义管理器

对比项 模型方法 (Model Methods) 自定义管理器 (Model Manager)
作用 针对单个对象的操作 查询集 (QuerySet) 级别的操作
调用方式 order.is_paid() Order.paid_orders.all()
适用场景 业务逻辑封装,如状态变更、计算 需要封装一类特定查询时
  • 模型方法适用于 需要对单个实例 (对象)执行的操作,如 is_paid()mark_as_paid()
  • 自定义管理器适用于 查询集级别的操作 ,如 Order.published.all()

💡 最佳实践

可以结合 自定义管理器模型方法

python 复制代码
class OrderManager(models.Manager):
    def paid_orders(self):
        return self.filter(status='paid')

class Order(models.Model):
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)
    status = models.CharField(max_length=20, default='pending')

    objects = models.Manager()  # 默认管理器
    paid = OrderManager()  # 自定义管理器,只查询已支付订单

    def is_paid(self):
        return self.status == 'paid'

    def mark_as_paid(self):
        self.status = 'paid'
        self.save(update_fields=['status'])

    def calculate_tax(self, tax_rate=0.1):
        return self.total_amount * tax_rate

这样:

  • Order.paid.all() 查询所有已支付订单(适用于批量查询)。
  • order.is_paid() 判断单个订单是否已支付

(五)总结

  1. 模型方法 用于单个实例 的操作,如状态判断、修改、计算等。
  2. save(update_fields=['status']) 提高数据库更新效率 ,避免 save() 更新所有字段。
  3. 结合自定义管理器 ,可以让查询和业务逻辑更加清晰:
    • 模型方法 处理单个对象 的逻辑(如 is_paid())。
    • 管理器 处理查询集 的逻辑(如 Order.paid.all())。

🚀 适用于 Django 项目的业务逻辑封装,提高代码可读性和复用性!

相关推荐
轻微的风格艾丝凡3 分钟前
嵌入式定时器计时技巧:用有符号数省略溢出判断的底层逻辑与实践
数据库·算法·dsp开发·嵌入式软件
Lonely丶墨轩36 分钟前
从登录入口窥见架构:一个企业级双Token认证系统的深度拆解
java·数据库·sql
收获不止数据库1 小时前
黄仁勋2026CES演讲复盘:旧世界,裂开了!
大数据·数据库·人工智能·职场和发展
汽车仪器仪表相关领域1 小时前
工况模拟精准检测,合规减排赋能行业 ——NHASM-1 型稳态工况法汽车排气检测系统项目实战经验分享
数据库·算法·单元测试·汽车·压力测试·可用性测试
2301_800256111 小时前
数据库设计中的 “数据依赖→设计异常→关系分解(范式)” 核心逻辑
数据库·postgresql
冰冰菜的扣jio1 小时前
Redis基础数据结构
数据结构·数据库·redis
汽车仪器仪表相关领域2 小时前
光轴精准测量,安全照明保障——NHD-8101/8000型远近光检测仪项目实战分享
数据库·人工智能·安全·压力测试·可用性测试
大爱编程♡2 小时前
Spring IoC&DI
数据库·mysql·spring
king_harry2 小时前
金仓数据库KingbaseES中WalMiner接口使用
数据库·kingbase·walminer
爱潜水的小L2 小时前
自学嵌入式day43,商城网页
数据库·oracle