我遇到过我需要使用Django Models存储在Postgres数据库中的二进制数据(使用os.urandom(BLOCK_SIZE)
创建)的情况。
我已经读过几个关于Django尚未支持Bytea(VARBINARY)字段类型的引用。我找到了一个引用here,但不知道从哪里获取该库(django_postgresql)。
我目前正在Ubuntu 12.04上使用Python 2.7和Django 1.4 - 如果这有帮助。
我已经阅读了一些建议,因为解决这个问题的方法是在存储之前将数据转换为十六进制。
import binascii
key = binascii.hexlify(value)
好的,现在怎样?我试图将此值保存到数据库但得到错误:
invalid byte sequence for encoding "UTF8": 0xd6c2
好的,我应该使用哪种数据字段来执行此操作?
key = models.TextField(max_length = 200)
?
key = models.CharField(max_length = 200)
?
key = models.???(max_length = 200)
...
我想远离创建自己的custom field type。首先,我对Django很陌生,对此感到不舒服。其次,我对数据库很陌生,所以我不知道从哪里开始定义这样的东西。
有什么建议吗?
答案 0 :(得分:1)
如果在保存密钥值时出现unicode错误,则表示您做错了。 binascii.hexlify()
返回一个简单的十六进制字符串,它不会为您提供"无效的字节序列"。
为了提高存储效率,请使用base64编码:
import base64
mymodelinstance.key = base64.b64encode(raw_key_value)
要解码:
raw_key_value = base64.b64decode(mymodelinstance.key)
您可以使用长度为BLOCK_SIZE * 2
的CharField来保存十六进制数据,或者使用4 * ( BLOCK_SIZE / 3)
作为base64。