【问题标题】:How to generate unique filename for django model.FileField如何为 django model.FileField 生成唯一的文件名
【发布时间】:2017-03-24 15:03:00
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我不认为它在上传时以这种方式工作,因为后缀看起来不像 uuid。事实上,我想知道这个自动重命名是按 FileField 完成的还是由 django 中的其他东西完成的
    【解决方案2】:

    我认为使用 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 等等。 不过,这可能应该记录在案。我不确定这种重命名是发生在管理代码还是模型代码中。

    所以最后,您可能只有一个选项可以单独保存文件名并在上传文件之前签入。

    【讨论】:

    • 谢谢,但当文件不存在时,我想保留原名。如果 2 个进程同时使用相同的文件名访问,我该怎么办...是否可以对现有文件进行原子测试?
    • 那么您应该将模型文件字段添加为唯一字段。如果数据库重复,则在脚本中尝试存储文件,您可以编写异常并更改文件名然后存储。
    • 谢谢,但这不是 FileField 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2016-12-16
    相关资源
    最近更新 更多