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() 用于规范化文件路径。

  1. 路径分隔符统一:
# Windows 风格转换为系统标准
folder_path = "C:\\folder\\subfolder"  
# Linux 风格
folder_path = "/folder/subfolder"
  1. 删除多余的分隔符:
# 输入
folder_path = "//folder///subfolder//"
# 规范化后
folder_path = "/folder/subfolder"
  1. 解析相对路径:
# 输入
folder_path = "/folder/./subfolder/../other"
# 规范化后
folder_path = "/folder/other"
  1. 处理不同操作系统的差异:
# Windows
folder_path = "C:/folder/subfolder"
# Linux
folder_path = "/folder/subfolder"

这样做的好处是:

  1. 确保存储的路径格式一致
  2. 避免因路径格式不同导致的重复记录
  3. 防止路径遍历攻击
  4. 提高路径比较的准确性

在实际使用中,这个方法会在以下情况被调用:

# 创建新任务时
task = BackupTask(
    hostname="server1",
    folder_path="//var///www/"  # 不规范的路径
)
task.save()  # clean() 会被自动调用,路径被规范化为 "/var/www"
 
# 更新任务时
task.folder_path = "/var/./www/"
task.save()  # 同样会被规范化