模型方法 (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()
判断单个订单是否已支付。
(五)总结
- 模型方法 用于单个实例 的操作,如状态判断、修改、计算等。
save(update_fields=['status'])
提高数据库更新效率 ,避免save()
更新所有字段。- 结合自定义管理器 ,可以让查询和业务逻辑更加清晰:
- 模型方法 处理单个对象 的逻辑(如
is_paid()
)。 - 管理器 处理查询集 的逻辑(如
Order.paid.all()
)。
- 模型方法 处理单个对象 的逻辑(如
🚀 适用于 Django 项目的业务逻辑封装,提高代码可读性和复用性!