django:如何更新FileSystemStorage中的现有文件

时间:2014-10-09 14:55:59

标签: django

目标是更新由'filename'标识的现有文件的内容 第一个保存调用(aStorage.save(filename,ContentFile(content1))创建文件'test1'。
第二个保存调用(aStorage.save(filename,ContentFile(content2)))创建一个新文件(由Storage.get_available_name完成),而不是更新当前的文件。

>>> from django.core.files.storage import FileSystemStorage
>>> from django.core.files.base import ContentFile
>>> import sys
>>> sys.path.append('/home/project1')
>>> import os
>>> os.environ['DJANGO_SETTINGS_MODULE']='project1.settings'
>>> from django.conf import settings
>>> aStorage = FileSystemStorage(location=settings.BASE_DIR)
>>> content1 = "1514 – Mary Tudor (pictured), sister of Henry VIII of England"
>>> content2 = "1874 – The Universal Postal Union, then known as the General Postal"
>>> filename =  os.path.join(settings.BASE_DIR, 'tests', 'test1')
>>> aStorage.save(filename, ContentFile(content1))
'./tests/test1'
>>> aStorage.save(filename, ContentFile(content2))
'./tests/test1_ESZ5jdM'

这里可能有一个解决方案:

>>>>if (aStorage.exists(filename)):
>>>>    aStorage.delete(filename)
>>> aStorage.save(filename,ContentFile(content2))
`'./tests/test1'`

是否还有其他机制/解决方法来实现相同的功能?谢谢。

2 个答案:

答案 0 :(得分:1)

如果您要“覆盖”该文件,可以使用自己的自定义Filestorage,如下所示:

class MyFileSystemStorage(FileSystemStorage):
    def get_available_name(self, name):
        if os.path.exists(self.path(name)):
            os.remove(self.path(name))
        return name

在这种情况下,将删除该文件,以便可以创建具有相同名称的文件。这感觉它会被覆盖。希望这是你正在寻找的。

更新: MyFileSystemStorage是一个小型自定义类,它继承自FileSystemStorage并覆盖Djangos FileSystemStorage中的“默认”get_available_name函数。您不需要直接使用此功能。如果您保存FileObject,它将被透明地处理。

你可以像这样使用它:

aStorage = MyFileSystemStorage(location=settings.BASE_DIR)

如果使用MyFileSystemStorage而不是Django FileSystemStorage并保存具有特定名称的文件,则将删除具有该名称的现有文件,并使用给定名称创建新文件。小心使用这样的代码,因为任何现有文件如果已经存在将被“覆盖”。如果我正确地按照你的例子你想要这种行为,那么我认为它不会对你现有的代码产生影响。

答案 1 :(得分:0)

我不清楚在哪种情况下我可以使用保存方法。因此,目前我不想更改/覆盖Django Storage.save/get_available_name方法行为。这听起来像我的问题的另一个解决方案:使用Storage.open方法而不是Storage.save:

>>> content1 = "11111111"
>>> content2 = "22222222"
>>> aStorage
<django.core.files.storage.FileSystemStorage object at 0x7f94ffccc6d0>
>>> fd = aStorage.open("test1.txt","w+")
>>> fd.write(content1)
8
>>> fd.seek(0)
0
>>> fd.read()
'11111111'
>>> fd.close()
>>>
>>> fd = aStorage.open("test1.txt","w+")
>>> fd.read()
''
>>> fd.write(content2)
8
>>> fd.seek(0)
0
>>> fd.read()
'22222222'
>>> fd.close()
>>> aStorage.exists("test1.txt")
>>> True

如果您能与我分享使用Django的Storage.save方法的情况,我将不胜感激。我在这里看一个真实的情况。感谢。