clean()
方法是 Django Model 的一个特殊方法,用于在保存模型实例之前对数据进行清理和验证。
例子:
from django.db import models
import os
class BackupTask(models.Model):
hostname = models.CharField(max_length=255, help_text="备份主机名")
folder_path = models.CharField(max_length=1024, help_text="要备份的文件夹路径")
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
unique_together = ['hostname', 'folder_path']
def clean(self):
self.folder_path = os.path.normpath(self.folder_path)
在这里,os.path.normpath()
用于规范化文件路径。
- 路径分隔符统一:
# Windows 风格转换为系统标准
folder_path = "C:\\folder\\subfolder"
# Linux 风格
folder_path = "/folder/subfolder"
- 删除多余的分隔符:
# 输入
folder_path = "//folder///subfolder//"
# 规范化后
folder_path = "/folder/subfolder"
- 解析相对路径:
# 输入
folder_path = "/folder/./subfolder/../other"
# 规范化后
folder_path = "/folder/other"
- 处理不同操作系统的差异:
# Windows
folder_path = "C:/folder/subfolder"
# Linux
folder_path = "/folder/subfolder"
这样做的好处是:
- 确保存储的路径格式一致
- 避免因路径格式不同导致的重复记录
- 防止路径遍历攻击
- 提高路径比较的准确性
在实际使用中,这个方法会在以下情况被调用:
# 创建新任务时
task = BackupTask(
hostname="server1",
folder_path="//var///www/" # 不规范的路径
)
task.save() # clean() 会被自动调用,路径被规范化为 "/var/www"
# 更新任务时
task.folder_path = "/var/./www/"
task.save() # 同样会被规范化