如何使用 django.core.files.storage.get_available_name?

jon*_*alv 5 django django-models

我正在存储文件并需要一个唯一的文件名。我找到了使用 django.core.files.storage.get_available_name 的建议,但我完全错过了一些东西。我试过这个:

class MyModel(models.Model):
    name         = models.CharField( max_length=200, null=True ) 
    filecontent  = models.FileField( null=True, upload_to=Storage.get_available_name(name) )
Run Code Online (Sandbox Code Playgroud)

并得到错误:TypeError: unbound method get_available_name() must be called with Storage instance as first argument (got CharField instance instead)我将其解释为我正在尝试在类上运行该方法,但我需要一个存储实例来运行它。存在一种叫做 DefaultStorage 的东西,它应该是“提供对当前默认存储系统的延迟访问”的东西,但它没有该get_available_name方法,而只有一个_setup不能在类上调用的方法。那么我应该如何让一个实例在这里工作呢?

m.a*_*icz 3

参数upload_to是您要将文件上传到的目录路径。存储的参数被命名为storage

因此,如果你想更改默认的 Django 存储实现,你应该做的是使用例如

    filecontent = models.FileField(null=True, upload_to='path/to/dir', storage=FileSystemStorage())
Run Code Online (Sandbox Code Playgroud)

如果您需要实现自己的方式来处理文件名,您只需创建继承Storage并覆盖其get_available_name方法的类。例如:

    class MyOwnStorage(FileSystemStorage):
        def get_available_name(self, name):
            if self.exists(name):
                #return something
            else:
                #return something_else
Run Code Online (Sandbox Code Playgroud)

然后按如下方式使用它:

    filecontent = models.FileField(null=True, upload_to='path/to/dir', storage=MyOwnStorage())
Run Code Online (Sandbox Code Playgroud)