如何正确格式化一个StringIO对象(Python和Django),以便插入数据库?

4

我有一个需求,需要使用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对象?
1个回答

13

没有任何限制要求 get_db_prep_value 返回“可打印”字符,ASCII字符或其他受限字符集:返回任何您想使用的字节字符串即可。在 to_python 中,你会得到一个字符串,并且可以使用文件类似的 StringIO 实例来读取其数据,例如 the_instance = StringIO.StringIO(value) (当然,你需要在模块顶部导入 import StringIO)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接