smo*_*ele 0 python django django-models python-imaging-library
我尝试从 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}
Run Code Online (Sandbox Code Playgroud)
现在,将此文件关联到我的对象的部分:
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
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但不幸的是,在正确的文件夹中创建了 mu 图片,创建/更新了对象,但每个对象都没有图片文件 :( 有人能告诉我出了什么问题吗?
我终于找到了解决方案:
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}
Run Code Online (Sandbox Code Playgroud)
进而:
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)
Run Code Online (Sandbox Code Playgroud)
希望这会在这种情况下帮助其他一些用户。