PIL 到 Django ImageField

PIL to Django ImageField

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

这是我生成图像文件的函数:

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

此代码有效,但不幸的是,mu 图片是在正确的文件夹中创建的,对象是 created/update,但每个都没有图片文件:( 谁能告诉我怎么了?

使用这样的模型:

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

你可以直接link电脑上的图片用is路径代替他的二进制内容

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

我终于找到了解决办法:

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)

希望这对遇到这种情况的其他用户有所帮助。