2017-05-04 50 views
0

我尝试从url创建一个图像并将其保存在我的django模型中。如果第一部分工作正常,我不知道如何将生成的文件关联到我的对象。PIL到Django ImageField

这是我的功能,生成图像文件:

def get_remote_image(image_url, merchant_product_path): 
    im = None 
    name = '' 
    r = requests.get(image_url, stream=True) 
    if r.status_code == 200: 
     name = urlparse(image_url).path.split('/')[-1] 

     full_path = os.path.join(settings.MEDIA_ROOT, merchant_product_path) 
     if not os.path.exists(full_path): 
      os.makedirs(full_path) 

     im = Image.open(r.raw) 
     if im.mode != "RGB": 
      im = im.convert("RGB") 
     im.thumbnail((500, 500), Image.ANTIALIAS) 
     im.save(full_path + name, 'JPEG') 

    return {'im': im, 'name': name} 

而现在,部分到此文件关联到我的对象:

i = get_remote_image(row['pict'], m.get_products_media_path()) 

    obj, created = ProductLine.objects.update_or_create(
    ... 
    ... 
    ... 
    ) 

if i['im'] is not None: 
    try: 
     obj.main_picture.save(
      i['name'], 
      ContentFile(i['im']), 
      save=True) 
    except TypeError: 
     continue 

此代码的工作,但不幸的是,亩照片是在正确的文件夹中创建对象创建/更新,但每个都没有图片文件:( 有人可以告诉我什么是错的吗?

回答

0

我终于找到了解决办法:

def get_remote_image(image_url): 
    im = None 
    name = '' 
    r = requests.get(image_url, stream=True) 
    if r.status_code == 200: 
     name = urlparse(image_url).path.split('/')[-1] 
     i = Image.open(r.raw) 
     buffer = BytesIO() 
     if i.mode != "RGB": 
      i = i.convert("RGB") 
     i.thumbnail((500, 500), Image.ANTIALIAS) 
     i.save(buffer, format='JPEG') 
     im = InMemoryUploadedFile(
      buffer, 
      None, 
      name, 
      'image/jpeg', 
      buffer.tell(), 
      None) 

    return {'im': im, 'name': name} 

然后:

obj, created = ProductLine.objects.update_or_create(
... 
... 
... 
) 
i = get_remote_image(row['pict']) 
obj.main_picture.save(
    os.path.join(m.get_products_image_path(), i['name']), 
    i['im'], 
    save=True) 

希望这将帮助一些其他用户在这种情况下。

0

有了像这样的模型:

class ProductLine(models.Model): 
    name = models.CharField(max_length=250, null=True) 
    image = models.ImageField(null=True) 

您可以使用is路径而不是他的二进制内容直接链接计算机上的图片。

obj, created = ProductLine.objects.update_or_create(...) 
obj.image.name = "/path/to/the/file" 
obj.save()