FileField在南迁移的上下文中不尊重upload_to

时间:2014-05-07 16:33:54

标签: python django django-south

我最近更改了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函数指示的位置。

经过一番思考后,我理解为什么会这样,但我该怎么办呢?

1 个答案:

答案 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()