如何正确格式化StringIO对象(python和django)以插入数据库?
我需要在数据库中存储图片,使用的是Django框架。为此,我创建了一个自定义字段:
from django.db import models
class BlobField(models.Field):
__metaclass__ = models.SubfieldBase
def db_type(self, connection):
#TODO handle other db engines
backend = connection.settings_dict['ENGINE']
if backend == 'django.db.backends.postgresql':
return 'bytea'
elif backend == 'django.db.backends.sqlite3':
return 'blob'
else:
raise Exception('unsuported db')
def to_python(self, value):
#TODO
return value
def get_db_prep_value(self, value, connection, prepared=False):
#TODO
return value
我已经实现了一个自定义的存储系统,用来处理图片的存储和取出,这个系统使用了一个包含上面提到的BlobField的自定义模型。在'get_db_prep_value'这个方法中,'value'参数是一个'StringIO'对象,里面存放的是图片的二进制数据。问题是,我不知道在'get_db_prep_value'方法中应该返回什么,因为'StringIO'对象肯定包含一些不可打印的字符。
我有几个关于这个问题的疑问:
- 在'get_db_prep_value'方法中,我应该返回什么?
- 如果期望的值是一个ASCII字符串,我能否以一种与数据库无关的方式表示这个blob(十六进制转义)?
- 如果不能,有没有现成的库可以帮我处理这种转换?
- 我可以期待在'to_python'方法中接收到什么样的输入,怎样才能把它转换成一个StringIO对象?
1 个回答
13
没有规定要求 get_db_prep_value
返回“可打印”的字符,或者ASCII字符,或者其他特定的字符集合:你可以返回任何你喜欢的字节字符串。在 to_python
中你会得到一个字符串,然后可以用 StringIO
创建一个类似文件的实例,通过 the_instance = StringIO.StringIO(value)
来读取它的数据(当然,你需要在模块的顶部 import StringIO
)。