在django管理区域中抛出ValidationError后,无法更改模型实例

时间:2011-11-28 08:41:40

标签: python django

想象一下这样的模型:

class CFile(models.Model):
   filepath   = models.FileField(upload_to=...)
   collection = models.ForeignKey("FileCollection",null=True)
   ... # other attributes that are not relevant

   def clean(self):
     bname = os.path.basename
     if self.collection:
       cfiles = self.baseline.attachment_set.all()
       with_same_basename = filter(lambda e: bname(e.filepath.path) == bname(self.filepath.path),cfiles)
       if len(with_same_basename) > 0:
         raise ValidationError("There already exists a file with the same name in this collection")   

class FileCollection(models.Model):
  name = models.CharField(max_length=255)
  files= models.ManyToManyField("CFile")

如果已存在具有相同基本名称的CFile,我想禁止上传CFile,这就是我添加clean的原因。问题是:

  • 我上传了名为file1.png - >的CFile。上传,因为没有其他具有此名称的文件
  • 我上传了另一个CFile,名称为file1.png - >我得到了预期的错误,我已经有了这个名字的文件。因此,我尝试更改文件,并上传具有不同名称(file2.png)的文件。问题是,我在clean中通过pdb停止了,模型实例仍然是file1.png。我想这会发生,因为我的ValidationError和django允许我“纠正我的错误”。问题是,如果我无法上传其他文件,我无法纠正它。我怎么处理这个?

编辑:这发生在管理区域,抱歉忘记之前提到这一点。我没有任何自定义(除了inlines = [ FileInline ])。

1 个答案:

答案 0 :(得分:1)

我认为最明确的方法是在模型中声明文件名中的另一个字段,并使其对每个集合都是唯一的。像这样:

class CFile(models.Model):
   filepath   = models.FileField(upload_to=...)
   collection = models.ForeignKey("FileCollection",null=True, related_name='files')
   filename = models.CharField(max_length=255)
   ... # other attributes that are not relevant

    class Meta:
        unique_together = (('filename', 'collection'),)

    def save(self, *args, **kwargs):
        self.filename = bname(self.filepath.path)
        super(CFile, self).save(args, kwargs)