如何正确格式化StringIO对象(python和django)以插入数据库?

4 投票
1 回答
2480 浏览
提问于 2025-04-16 05:22

我需要在数据库中存储图片,使用的是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)。

撰写回答