【问题标题】:Store os.urandom variable to Sqlite database in Django将 os.urandom 变量存储到 Django 中的 Sqlite 数据库
【发布时间】:2016-05-12 06:15:13
【问题描述】:

我正在尝试将随机变量存储到 Django 中的 Sqlite 数据库,但出现此错误:

除非您使用可以解释 8 位字节串的 text_factory(如 text_factory = str),否则不得使用 8 位字节串。强烈建议您将应用程序切换为 Unicode 字符串。

这是我的代码:

random_number = os.urandom(16)
SomeModel.objects.filter(id=2).update(number=random_number)

模型.py:

class SomeModel(models.Model):
    random = models.CharField(max_length=32)

我使用 Python 2.7.10 和 Django 1.9。

【问题讨论】:

  • SomeModel 是什么样的? SomeModel.number 的类型是什么? os.urandom() 不返回数字,它返回字节(python2 中也是 str)。
  • 我已经将模型中的数字字段设置为 CharField,所以可能存在问题。是的,我知道它返回字节,但是我如何对其进行编码,以便 Sqlite 可以存储它?我会将模型更新为问题。
  • 这似乎相关:docs.djangoproject.com/en/1.9/ref/models/fields/#binaryfield "存储原始二进制数据的字段。它仅支持字节分配。请注意,此字段的功能有限。例如,无法过滤查询集在 BinaryField 值上。”

标签: python django sqlite django-views


【解决方案1】:

如果仍然可以,您可以更改模型以使用BinaryField

class SomeModel(models.Model):
    random = models.BinaryField(max_length=32)

另一方面,如果模型已经确定,请考虑一些二进制到文本编码,例如 base64:

from base64 import b64encode

random_number = os.urandom(16)
SomeModel.objects.filter(id=2).update(number=b64encode(random_number))

【讨论】:

  • 可以将字段更改为 BinaryField,现在它可以工作了。谢谢!
猜你喜欢
  • 2020-03-22
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多