目标是更新由'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'`
是否还有其他机制/解决方法来实现相同的功能?谢谢。
答案 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
在这种情况下,将删除该文件,以便可以创建具有相同名称的文件。这感觉它会被覆盖。希望这是你正在寻找的。 p>
更新:
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方法的情况,我将不胜感激。我在这里看一个真实的情况。感谢。