保存模型字段时的 Django-Storages ('`data` must be bytes, received', <class 'str'>)

Posted

技术标签:

【中文标题】保存模型字段时的 Django-Storages (\'`data` must be bytes, received\', <class \'str\'>)【英文标题】:Django-Storages ('`data` must be bytes, received', <class 'str'>) when saving a model field保存模型字段时的 Django-Storages ('`data` must be bytes, received', <class 'str'>) 【发布时间】:2020-02-09 21:33:52 【问题描述】:

我阅读了django-storages docs,其中建议使用以下内容将文件保存到云存储(在我的情况下为 GCS):

>>> obj2 = Resume()
>>> obj2.pdf.save('django_test.txt', ContentFile('more content'))
>>> obj2.pdf
<FieldFile: tests/django_test_.txt>
>>> obj2.pdf.size

但是,按照相同的逻辑,我正在努力使用 FileField 对象将 Pandas DataFrame 保存为 CSV:

我的代码:

   df = load_some_df()
   print(df.head())
   # prints contents of df
   contents = ContentFile(df.to_csv(index=False, header=True))
   output_file_name = 'df.csv'

   instance = MyModel()
   instance.output_file.save(output_file_name, contents)

上面给了我错误:

('`data` must be bytes, received', <class 'str'>)

【问题讨论】:

【参考方案1】:

df.to_csv(index=False, header=True) 替换为df.to_csv(index=False, header=True).encode('utf-8')

【讨论】:

很高兴你成功解决了自己的问题,但最好多写一些关于你在此过程中学到的东西以及为什么改变很重要。 我真的不知道为什么会这样。因为ContentFile() 一样高兴地接受了一个字符串对象。这是第 3 方django-storages 问题,或者看起来如此。在本地,这两个选项都有效。 根据我的分析,这是一个 internet 问题。您需要能够序列化事物以通过网络发送它们。您可能会问为什么图书馆不在内部处理它;这是他们开发团队的问题。

以上是关于保存模型字段时的 Django-Storages ('`data` must be bytes, received', <class 'str'>)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DRF + django-rest-auth 中使用自定义用户模型保存注册时的额外字段

模型 ID = 0 时的 ExtJS 文本字段或组合框 defaultValue

保存模型时的Laravel模型尾随数据[重复]

向现有 django 模型添加新的唯一字段时的最佳实践

Django-storages + boto + S3 collectstatic 的最小凭据

Django-storages 未检测到更改的静态文件