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() # 同样会被规范化