我有一个需求,需要使用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'对象。问题在于,由于'StringIO'对象肯定包含不可打印字符,我不知道在'get_db_prep_value'方法中返回什么。
关于这个问题,我有一些疑问:
- 在'get_db_prep_value'方法中应该返回什么?
- 如果预期值是ASCII字符串,是否可以以数据库无关的方式表示blob(十六进制转义)?
- 如果不能,是否有内置库可以为我处理此类转换?
- 在'to_python'方法中,我可以期望收到什么样的输入,如何将其转换为StringIO对象?