首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用South将数据从ImageField迁移到ImageField

使用South将数据从ImageField迁移到ImageField
EN

Stack Overflow用户
提问于 2011-08-07 02:29:57
回答 4查看 2.1K关注 0票数 4

我现在已经尝试了几个小时使用South进行最愚蠢的迁移,但不知何故,我一直失败得很痛苦。我正在尝试迁移到Sorl-缩略图。

下面是我的过渡模型:

代码语言:javascript
复制
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')

我的下一步迁移到目前为止是这样的:

代码语言:javascript
复制
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()

这是此代码的最新版本。所有其他的,大多数都无法正确地将图像文件放到新目录中。

救命..。:)

时光流逝..。

好吧..。经过几次测试,我得到了以下代码:

代码语言:javascript
复制
 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')中。我在*行中尝试了一下,但仍然没有成功:

代码语言:javascript
复制
deal.new_image.save('new_ideal_images/'+deal.image.name,file_content)

窗台不能工作。

请帮帮我。:)

随着时间的推移..。

好的..。我认为南方存在一些严重的问题:

这段代码在Django Shell中运行良好,将所有文件复制到正确的位置:

代码语言:javascript
复制
 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根目录中的所有文件,而不会将其移动到正确的子目录中:

代码语言:javascript
复制
 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()
EN

回答 4

Stack Overflow用户

发布于 2011-11-30 08:00:44

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

代码语言:javascript
复制
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()
票数 4
EN

Stack Overflow用户

发布于 2011-11-01 09:38:32

我遇到了同样的问题,并通过直接分配路径而不是文件来解决它:

代码语言:javascript
复制
for tagged in orm.ImageTag.objects.all():
   with tagged.image.content:
     filename = tagged.image.content.name.split('/')[1]
     path = default_storage.save('taggedImages/' + filename, tagged.image.content)
     tagged.imageFile = path
     tagged.save()
票数 3
EN

Stack Overflow用户

发布于 2012-12-08 17:56:12

多亏了Mike Fogel的回答,我在迁移中解决了这个问题,将图像从一个模型移动到另一个模型:

代码语言:javascript
复制
from south.v2 import DataMigration

from .. models import upload_by_conditions
from .. models import RESOURCE_IMAGE


class Migration(DataMigration):

    def forwards(self, orm):
        src = orm['uploader.Queue']
        dst = orm['uploader.Resource']
        for item in src.objects.all():
            obj = dst(
                kind=RESOURCE_IMAGE,
                file_name=item.file_name,
                file_type=item.file_type,
                file_size=item.file_size,
            )
            # here I assign own handler!!!
            obj._meta.get_field('resource').generate_filename = upload_by_conditions
            obj.resource.save(item.file_name, item.image, save=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6968789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档