2010-10-12 53 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)。

相關問題