gpt4 book ai didi

django - 使用 South 从 ImageField 到 ImageField 的数据迁移

转载 作者:行者123 更新时间:2023-12-03 12:01:21 24 4
gpt4 key购买 nike

我现在尝试了几个小时来使用 South 进行最愚蠢的迁移,但不知何故,我一直在悲惨地失败......我正在尝试迁移到 Sorl-Thumbnail。

这是我的过渡模型:

class Deal(models.Model):
image = ImageWithThumbsField(upload_to='deal_images',null=True,blank=True,sizes=(200,150),))
new_image = ImageField(upload_to='new_deal_images',default='deal_images/thumb_deal_noimg.gif')

到目前为止,我的向前迁移是这样的:
def forwards(self, orm):
for deal in orm.Deal.objects.all():
try:
image_name = deal.image.name.split('/')[1]
file_ = File(deal.image.open()) # I've also tried the method read()
deal.new_image.save('new_deal_images/'+image_name,file_,save=False)
except:
deal.new_image = None # For the default image kick in
deal.save()

这是此代码的最新版本。所有其他人,大多未能将图像文件正确放入新目录中。

帮助... :)

时光流逝....

好吧...经过几次测试我得到了这个代码:
 def forwards(self, orm):
for deal in orm.Deal.objects.all():
file_content = ContentFile(deal.image.read())
deal.new_image.save(deal.image.name,file_content) *
deal.save()

图像被复制并保存在新列 (new_image) 中,但问题是所有文件都保存在 MEDIA_ROOT 根目录中,而不是所需的子目录 ('new_deal_images') 中。我在 * 行中尝试过这个,但仍然没有运气:
deal.new_image.save('new_ideal_images/'+deal.image.name,file_content)

还是不工作...

请帮忙... :)

又一个时间过去了......

好的...我认为South有一些严重的问题:

此代码在 Django Shell 中完美运行,将所有文件复制到正确的位置:
 15         for deal in Deal.objects.all():
16 image_path = deal.image.path·
17 file_ = File(open(image_path,'rb'))
18 deal.new_image.save(deal.image.name,file_)
19 deal.save()

但是迁移文件中的这段代码不会,转储 MEDIA_ROOT 根目录中的所有文件,而不将其移动到正确的子目录:
 15         for deal in orm.Deal.objects.all():
16 image_path = deal.image.path·
17 file_ = File(open(image_path,'rb'))
18 deal.new_image.save(deal.image.name,file_)
19 deal.save()

最佳答案

您可以在 South orm 中覆盖该字段的 generate_filename 方法。例如,这会将 'image' 字段中的所有图像复制到 'new_image' 字段,只需更改它们存储的目录。

for deal in orm.Deal.objects.all():
deal._meta.get_field('new_image').generate_filename = \
lambda inst, fn: os.path.join('new_deal_images', fn)
img_data = SimpleUploadedfile(deal.image.name, deal.image.read())
deal.image.close()
setattr(deal, 'new_image', img_data)
deal.save()

关于django - 使用 South 从 ImageField 到 ImageField 的数据迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com