Django存储系统的差异

时间:2012-10-25 17:41:34

标签: django

我有一个Django应用程序,它使用FileSystemStorage进行开发,使用S3BotoStorage进行分段和生产。一切都很好。我注意到这些系统之间存在一些细微差别:

  1. FileSystemStorage会将MEDIA_ROOT值附加到任何文件中 扑救。 S3BotoStorage默认不会。

  2. 如果我用FileField删除模型实例,S3BotoStorage会 删除FileField的文件和文件所在的目录 file是该目录中唯一的文件。 FileSystemStorage不会 删除空目录。

  3. 我可以解决这些差异,但是它们会为我的代码添加条件。第一个是最简单的 - 我只是使用location=MEDIA_ROOT初始化S3BotoStorage类。有没有办法以类似的方式处理第二个?我可以配置任何存储类的目录删除行为吗?我应该覆盖FileSystemStorage的删除方法吗?

1 个答案:

答案 0 :(得分:3)

FileSystemStorage.delete的代码(第144行)没有我能看到的任何配置:

def delete(self, name):
    name = self.path(name)
    # If the file exists, delete it from the filesystem.
    # Note that there is a race between os.path.exists and os.remove:
    # if os.remove fails with ENOENT, the file was removed
    # concurrently, and we can continue normally.
    if os.path.exists(name):
        try:
            os.remove(name)
        except OSError as e:
            if e.errno != errno.ENOENT:
                raise

所以,是的,最简单,最干净的方法可能是覆盖其删除方法,以另外检查空目录的情况。