如何为django model.FileField生成唯一的文件名

时间:2016-11-10 14:31:52

标签: django django-models django-forms

我正在研究一个django / python项目。 此项目使用包含FileField的模型。 该模型由Web表单提供。一切都很好:如果现有的同名文件已经存在,Django会自动重命名该文件。

我有第二个模型,它还包含一个FileField。但是此文件不是通过Web表单上传的。这个文件内容是由python程序在文件上生成的。我想要做的是在插入时提供文件名。我希望Django / Python能够自动重命名,因为它没有Web表单。 我该怎么办?

感谢。

2 个答案:

答案 0 :(得分:2)

我认为在这个答案中解释了最简单的方法:

https://stackoverflow.com/a/10501355/3848720

您可以将文件名称为通用唯一标识符(UUID),如上面的答案所示。或者您可以将UUID附加到现有名称上,如下所示:

import uuid

filename = '%s%s' % (existing_filename, uuid.uuid4())

答案 1 :(得分:1)

我认为使用UUID会使你的文件名这么久。这也可以帮助您: -

  import os, random, string
  length = 13
  chars = string.ascii_letters + string.digits + '!@#$%^&*()'
  random.seed = (os.urandom(1024))
  a = ''.join(random.choice(chars) for i in range(length))

注意: - 根据您的意愿调整长度参数。

filename = '%s%s' % (Yourfilename,str(a))

将models.py更改为:

fileName = CharField(max_length=10, blank=True,unique=True)

将views.py更改为:

try:
    filename  = filename
    storeFileName = models.objects.create(fileName=filename) 
except Exception,e:
   import os, random, string
   length = 13
   chars = string.ascii_letters + string.digits + '!@#$%^&*()'
   random.seed = (os.urandom(1024))
   a = ''.join(random.choice(chars) for i in range(length))

   filename = '%s%s' % (Yourfilename,str(a))

   storeFileName = models.objects.create(fileName=filename)

您无法为unique=True设置fileField这可能是Django中的错误,它将按如下方式运行:

显然,会发生什么: 如果该文件已存在,则新文件将命名为< >。,其中< >是使名称唯一所需的下划线数量。因此,例如,当多次上载名为foo.png的文件时,第二个文件将命名为foo_.png,第三个文件将命名为foo __。png,依此类推。 但是,这可能应该记录在案。我不确定这种重命名是在管理代码还是在模型代码中发生的。

所以最终,你可能只有一个选项可以单独保存文件名并在上传文件之前检查它。