django - 通过 Django shell 添加文件

标签 django

Django 1.11.6

我正在尝试通过 Django shell 保存文件。你能看看回溯并告诉我我做错了什么吗?

型号:

class ItemFile(ChecksumMixin,
               models.Model):
    item = models.ForeignKey(Item,
                             on_delete=models.PROTECT,
                             verbose_name=_("item"))


    file = models.FileField(blank=False,
                            max_length=255,
                            upload_to=get_item_path,
                            verbose_name=_("file"))

在外壳中:

from django.core.files import File
f = File('/home/michael/PycharmProjects/photoarchive_4/general/static/test/text_1.pdf', 'rb')
i = Item.objects.get(pk=1)

ItemFile.objects.create(item=i, file=f)

回溯:

Traceback (most recent call last):
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1059, in <listcomp>
    for obj in self.query.objs
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1058, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1008, in pre_save_val
    return field.pre_save(obj, add=True)
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/db/models/fields/files.py", line 296, in pre_save
    file.save(file.name, file.file, save=False)
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/db/models/fields/files.py", line 94, in save
    self.name = self.storage.save(name, content, max_length=self.field.max_length)
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/core/files/storage.py", line 54, in save
    return self._save(name, content)
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/core/files/storage.py", line 351, in _save
    for chunk in content.chunks():
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/core/files/base.py", line 81, in chunks
    data = self.read(chunk_size)
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/core/files/utils.py", line 16, in <lambda>
    read = property(lambda self: self.file.read)
AttributeError: 'str' object has no attribute 'read'

最佳答案

Django File 类需要一个 Python file 对象,而不是路径/文件名:

f = File(open('/home/…/text_1.pdf', 'rb'))

Django 文档:https://docs.djangoproject.com/en/1.11/topics/files/#the-file-object (另请参阅有关关闭打开的文件的说明)

关于django - 通过 Django shell 添加文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47055538/

相关文章:

python - 尝试使用 mod_wsgi 运行 2 个具有不同 Python 版本的 Python 应用程序

python - Django model.py models.ForeignKey()

Django/Graphene/Apollo/django-webpack-loader/Vue : CORS/CSRF not working together?

django - 注册表单唯一邮箱

python - Django 中不寻常的 setdefault

python - 无法在弹性 beantalk 上的 django 应用程序上安装 nltk 数据

django - 在 Django 中使用 UTF-8 编码的 JSON fixture 文件

javascript - Django 管道和 javascript 依赖项

python - Django 在 Save() 之后立即更新表

python - Django 查询 : Getting data over two relations