2010-10-12 49 views
4

我有一个requeriment存储使用Django在数据库中的图像,为此,我创建了一个自定义字段:如何正确格式化要插入数据库的StringIO对象(python和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 

我已经实现了使用自定义模式自定义storage system处理图像的存储/检索(包含上面的BlobField)。 'get_db_prep_value'方法中的'value'参数是一个包含图像二进制数据的'StringIO'对象。问题在于我不知道'get_db_prep_value'方法返回什么,因为'StringIO'对象肯定包含不可打印的字符。

我对这个问题的一些问题:

  • 我应该回在“get_db_prep_value”的方法?
  • 如果期望值是一个ASCII字符串,我可以用独立于数据库的方式表示blob(十六进制转义符)吗?
  • 如果没有,是否有内置的库为我处理这种转换?
  • 我可以期待作为'to_python'方法的输入,以及如何将其转换为StringIO对象?

回答

13

没有要求get_db_prep_value返回字符的“打印”的字符,或者ASCII的,或以其他方式受限套约束:返回映入你的想象任意字节串。您将在to_python中得到一个字符串,并可以使StringIO实例读取其数据(the_instance = StringIO.StringIO(value))(当然,您需要在模块的顶部需要import StringIO)。

相关问题