首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django文件字段如何用stream io填充

Django文件字段如何用stream io填充
EN

Stack Overflow用户
提问于 2019-03-20 23:39:31
回答 2查看 1.6K关注 0票数 1

我试图在模型中附加一个文件,该文件当前不在磁盘上,但存在于内存中。该模型使用django-filer,如果我传递一个常规文件它可以工作,使用io流它会失败。

代码语言:javascript
复制
def test_save_bytesio():
from PIL import Image
import io

from django.core.files.uploadedfile import InMemoryUploadedFile
from django.core.files.uploadedfile import SimpleUploadedFile

img = Image.new("RGB",(4,4))
thumb_io = io.BytesIO()
img.save(thumb_io, format='JPEG')

# thumb_file = InMemoryUploadedFile(thumb_io, None, '{}_da_ordine.jpg'.format(1), 'image/jpeg',
#    thumb_io,None)
thumb_file = DjangoFile(thumb_io.getvalue(), name='gigi')
#thumb_file = DjangoFile(thumb_io, name='gigi')

mymodel = MyModelTosave.objects.create(
                 name='gigi',
                 file=thumb_file
               )

这是错误堆栈:

代码语言:javascript
复制
    return field.pre_save(obj, add=True)
../../.local/share/virtualenvs/--M2Y9QA9/lib/python3.7/site-packages/django/db/models/fields/files.py:288: in pre_save
    file.save(file.name, file.file, save=False)
../../.local/share/virtualenvs/--M2Y9QA9/lib/python3.7/site-packages/filer/fields/multistorage_file.py:121: in save
    content.seek(0)  # Ensure we upload the whole file
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <File: gigi>

>   seek = property(lambda self: self.file.seek)
E   AttributeError: 'bytes' object has no attribute 'seek'

../../.local/share/virtualenvs/--M2Y9QA9/lib/python3.7/site-packages/django/core/files/utils.py:20: AttributeError

问题似乎出在这一行:

代码语言:javascript
复制
                         name='gigi',
>                        file=thumb_file
                       )

将thumb_file传递到文件字段的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-21 21:27:27

在创建Djangofile之前添加这段代码就成功了:

代码语言:javascript
复制
thumb_io.seek(0)
票数 1
EN

Stack Overflow用户

发布于 2019-03-21 01:46:58

尝试首先创建模型的实例,然后在FileField上单独调用save(),将BytesIO实例包装在Django的File中,例如:

代码语言:javascript
复制
from django.core.files import File

mymodel = MyModelTosave()
mymodel.file.save('gigi', File(thumb_io), True)

请注意,第三个参数True确保在文件保存完成后保存模型实例本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55264697

复制
相关文章

相似问题

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