想象一下这样的模型:
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。上传,因为没有其他具有此名称的文件file1.png
- >我得到了预期的错误,我已经有了这个名字的文件。因此,我尝试更改文件,并上传具有不同名称(file2.png
)的文件。问题是,我在clean中通过pdb停止了,模型实例仍然是file1.png
。我想这会发生,因为我的ValidationError和django允许我“纠正我的错误”。问题是,如果我无法上传其他文件,我无法纠正它。我怎么处理这个?编辑:这发生在管理区域,抱歉忘记之前提到这一点。我没有任何自定义(除了inlines = [ FileInline ]
)。
答案 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)