Python 使用django和sqlite存储BLOB数据

Python 使用django和sqlite存储BLOB数据,python,django,orm,blob,blobstorage,Python,Django,Orm,Blob,Blobstorage,首先,我知道有很多类似的问题,但其他解决方案不包括我的具体情况: 在我的sqlite数据库中有现有的二进制数据(SHA1和类似的散列)。通过谷歌搜索和阅读,我得出以下结论: import base64 class BlobField(models.Field): """ Stores raw binary data """ description = 'Stores raw binary data' __metaclass__ = models.SubfieldBase def __in

首先,我知道有很多类似的问题,但其他解决方案不包括我的具体情况:

在我的sqlite数据库中有现有的二进制数据(SHA1和类似的散列)。通过谷歌搜索和阅读,我得出以下结论:

import base64

class BlobField(models.Field):
""" 
Stores raw binary data
"""

description = 'Stores raw binary data'
__metaclass__ = models.SubfieldBase

def __init__(self, *args, **kwds):
    super(BlobField, self).__init__(*args, **kwds)

def get_internal_type(self):
    return "BlobField"

def get_db_prep_value(self, value, connection=None, prepared=False):
    return base64.decodestring(value)

def to_python(self, value):
    return base64.encodestring(value)
这正是我想要的,值在正确的时刻被编码和解码,但是在将模型保存到数据库中时,它给了我以下错误:

DatabaseError:除非使用 可以解释8位ByTestRing的文本工厂(如文本工厂= str)。强烈建议您只需切换 Unicode字符串的应用程序

我怎样才能解决这个问题?(可能不会破坏应用程序其余部分的所有unicode兼容性)

我无法更改db列的格式,因为其他应用程序正在使用该数据


编辑: 根据@filip dupanovic的建议,我采用了BinaryField类,如下所示:

类二进制字段(models.Field): description=u389;(“原始二进制数据”)

注意我必须在
get\u db\u prep\u value()
处插入的注释,就像这样,如果我取消注释这些行,就会得到一个错误

TypeError:get_db_prep_value()为关键字参数“connection”获取了多个值


我可以接受这一点,但不完全理解将其排除在外的含义。即使没有对
super()
的调用,它仍能工作吗?

不久前关闭的票据,添加了一个
二进制字段
模型字段。您应该特别关注与如何将内部
BlobField
字段类型映射到数据库支持的适当类型相关的更改。

这是我第一次尝试的,但效果不理想。我对编辑中显示的当前解决方案感到满意,如果没有人对我添加的评论发表任何担忧,我将坚持使用它,因为您所做的是更改调用
BinaryField.get_db\u prep\u value
中参数的顺序,这需要仔细阅读。
def get_db_prep_value(self, value, connection, prepared=False):
    value = super(BinaryField, self
        ).get_db_prep_value(value, connection, prepared)
    if value is not None:
        return connection.Database.Binary(value)
    return value
def get_db_prep_value(self, value, connection, prepared=False):
    value = super(BinaryField, self
        ).get_db_prep_value(value, connection, prepared)
    if value is not None:
        return connection.Database.Binary(value)
    return value