2011-11-28 75 views
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 ])。

回答

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) 
+0

我正在使用'RandomFileStorage',因为可能有多个'FileCollection'具有'CFile'这个名字。所以,我认为它不会重复。 – Geo

+0

@Tempus从未听说过“RandomFileStorage”(并且google给了我0个结果)。但我很确定,如果有一个带有这个名字的文件,Django会自动重命名文件。 – DrTyrsa

+0

对不起,当我写关于RandomFileStorage的时候,电源已经关闭。它只是一个确保文件上传到名称随机生成的文件夹的存储。一个文件保持相同的名称很重要(自动重命名不好)。 – Geo