1
想像这样一个模型:无法更改模型实例
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
。问题是:
- 我上传的CFile,名为
file1.png
- >被上传,因为存在 - 具有此名称的其他文件,我上传其他CFile的,名称为
file1.png
- >我得到预期的错误我已经有一个这个名字的文件。所以,我尝试更改文件,并上传具有不同名称的文件(file2.png
)。问题是,我通过pdb停止清理,模型实例仍然为file1.png
。我想这会发生,因为我的ValidationError和Django允许我“纠正我的错误”。问题是我无法更正它,如果我不能上传另一个文件。我该如何处理?
编辑:这发生在管理区,抱歉忘了提前这个。我没有任何习惯(除了inlines = [ FileInline ]
)。
我正在使用'RandomFileStorage',因为可能有多个'FileCollection'具有'CFile'这个名字。所以,我认为它不会重复。 – Geo
@Tempus从未听说过“RandomFileStorage”(并且google给了我0个结果)。但我很确定,如果有一个带有这个名字的文件,Django会自动重命名文件。 – DrTyrsa
对不起,当我写关于RandomFileStorage的时候,电源已经关闭。它只是一个确保文件上传到名称随机生成的文件夹的存储。一个文件保持相同的名称很重要(自动重命名不好)。 – Geo