假设我有以下模型定义:
class Image(models.Model):
image = models.ImageField(upload_to='images')
现在进一步假设我想获取远程URL的内容并在上面的模型中插入一行。以此图片为例:
https://www.python.org/images/python-logo.gif
我从以下代码开始:
from tempfile import NamedTemporaryFile
fn = 'https://www.python.org/images/python-logo.gif'
# Read the contents into the temporary file.
f = NamedTemporaryFile()
f.name = fn
f.write(urlopen(fn).read())
f.flush()
# Create the row and save it.
r = Image(image=File(f))
r.save()
我认为没有理由不这样做。经过一些调试后,我发现了:
MEDIA_ROOT
目录中创建,但大小为0 有人能说清楚这里发生了什么吗?我究竟做错了什么?有更简单的方法吗?
如果有帮助,我在Linux上运行Django 1.4。
答案 0 :(得分:1)
你确定没有例外吗?当我尝试这个时,我得到AttributeError: Unable to determine the file's size.
这可能是由f.name = fn
引起的。无法测量没有实际路径的文件(fn是URL)。将f.name恢复为原始值可以解决您的两个问题。
如果要显式设置新文件的名称,请使用:
newfile = File(f,name='python-logo.gif')
r=Image(image=newfile)
r.save()
newfile.close()
(额外的行因为File对象不会自动关闭)