gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:31 26 4
gpt4 key购买 nike

想象一个这样的模型:

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 的 CFile -> 我收到了预期的错误,表明我已经有一个具有此名称的文件。因此,我尝试更改文件,并上传具有不同名称的文件( file2.png )。问题是,我在 clean 中通过 pdb 停止了,模型实例仍然是 file1.png。我想这是因为我的 ValidationError 和 django 允许我“纠正我的错误”而发生的。问题是如果我无法上传另一个文件,我就无法纠正它。我该如何处理这个问题?

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

最佳答案

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

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)

关于python - 在 django 管理区域中抛出 ValidationError 后无法更改模型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8293333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com