Django自定义文件存储系统

10 投票
3 回答
12054 浏览
提问于 2025-04-16 11:12

我有一个自定义的存储方式

import os
from django.core.files.storage import Storage


class AlwaysOverwriteFileSystemStorage(Storage):
    def get_available_name(self, name):
        """
        Directly Returns a filename that's 
        from what user input.
        """
        if self.exists(name):
    # Remove the existing file
        os.remove(name)
    # Return the input name as output
        return name

我想知道应该把这个 AlwaysOverwriteFileSystemStorage.py 文件放在哪里,以及我的 settings.py 应该怎么定义 DEFAULT_FILE_STORAGE

我的 Django 根文件夹是 /home/username/webapp

当我把 DEFAULT_FILE_STORAGE = 'site.storage.AlwaysOverwriteFileSystemStorage' 放进去时,它返回了一个

错误

导入存储模块 site.storage 时出错:“没有名为 storage 的模块”

我对 Python/Django 不太熟悉,任何帮助都非常感谢。谢谢。

3 个回答

1

我尝试做这个,但对我来说不管用,直到我在我的storage.py文件里做了这个:

import os
from django.conf import settings
from django.core.files.storage import FileSystemStorage


class MyFileSystemStorage(FileSystemStorage):
    def get_available_name(self, name, *args, **kwargs):
        if self.exists(name):
            os.remove(os.path.join(settings.MEDIA_ROOT, name))
        return super().get_available_name(name, *args, **kwargs)

没有其他的改动是必要的。

还有另一种方法可以做到这一点:

from django.core.files.storage import FileSystemStorage

class AvatarStorage(FileSystemStorage):

    def get_available_name(self, name, *args, **kwargs):
        self.delete(name)
        return super().get_available_name(name, *args, **kwargs)

删除的方法会检查文件是否存在。所以这三行代码就足够了。希望这能帮到某些人。

24

你不需要在你的 settings.py 文件里放任何东西。直接在你的模型里使用就可以了。例如,在你的应用程序所在的地方创建一个 storage.py 文件,然后把 OverwriteStorage() 放进去。这样,你的模型看起来就像这样:

from storage import OverwriteStorage
...
class MyModel(models.Model):
    ...
    image = ImageField(upload_to='images', storage=OverwriteStorage())

我也在使用一个自定义的存储系统来覆盖已有的文件。我的 storage.py 文件是这样的:

from django.core.files.storage import FileSystemStorage

class OverwriteStorage(FileSystemStorage):
    """
    Returns same name for existing file and deletes existing file on save.
    """                                                              
    def _save(self, name, content):
        if self.exists(name):
            self.delete(name)
        return super(OverwriteStorage, self)._save(name, content)

    def get_available_name(self, name):
        return name
5

你可以把它放在任何地方,但你需要在settings.py文件中指定这个路径。

你可以把这个 storage.py 文件放在根文件夹里(就是那个有 manage.py 的文件夹),然后在设置中把路径指向 storage.AlwaysOverwriteFileSystemStorage

撰写回答