2016-11-10 90 views
1

我正在研究一个django/python项目。 该项目使用包含FileField的模型。 这个模型是由网页表单提供的。一切都很好:Django自动重命名文件,如果一个已存在的同名文件已经存在。如何为django模型生成唯一的文件名.FileField

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

谢谢。

回答

1

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

import os, random, string 
    length = 13 
    chars = string.ascii_letters + string.digits + '[email protected]#$%^&*()' 
    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 + '[email protected]#$%^&*()' 
    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=TruefileField可能是错误Django中,将工作如下:

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

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

+0

谢谢但是当文件不存在时,我想保留原来的名称。如果使用相同的文件名同时处理访问权限,我应该怎么做......有可能使原子成为现有文件的测试吗? – Bob5421

+0

然后您应该添加模型fileField作为唯一的字段。并在脚本中尝试存储文件,如果数据库如果有重复,你可以写入异常和更改文件名,然后存储。 –

+0

检查我的最后编辑@ Bob5421 –

2

我认为这样做最简单的方法是在这个答案解释:

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

你既可以只是调用文件名的通用唯一标识符(UUID)如上回答。或者你可以在UUID追加到现有的名称如下:

import uuid 

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

我不认为它在上传时以这种方式工作,因为该后缀不寻找到uuid。事实上,我想知道如果这个自动重命名是每个FileField完成或由Django的其他东西 – Bob5421