我最近更改了FileField的upload_to参数,现在我正在尝试编写一个South datamigration来将存储在旧系统下的文件移动到新系统。我写了一些FileField文档表明应该工作的代码:
def forwards(self, orm):
for mf in orm.ManagedFile.objects.all():
print mf.content.path
oldpath = mf.content.path
cf = ContentFile(mf.content.read())
cf.name = oldpath
mf.content = cf
mf.save()
这会根据某些默认规则保存所有文件,并且它们都会在MEDIA_ROOT中消失,而不是在upload_to函数指示的位置。
经过一番思考后,我理解为什么会这样,但我该怎么办呢?
答案 0 :(得分:0)
可以手动重新附加upload_to函数,如下所示:
mf._meta.get_field('content').generate_filename = path_maker
结果代码如下所示:
def path_maker(m_file, filename):
ext = str(os.path.splitext(filename)[1])
return os.path.join('m_files', m_file.hash) + ext
...
def forwards(self, orm):
for mf in orm.ManagedFile.objects.all():
mf._meta.get_field('content').generate_filename = path_maker
print mf.content.path
oldpath = mf.content.path
cf = ContentFile(mf.content.read())
cf.name = oldpath
mf.content = cf
mf.save()