2011-02-06 192 views
22

如何使用Django的ORM和PostgreSQL後端存儲二進制數據的「blob」?是的,我知道Django不喜歡這樣的事情,是的,我知道他們更喜歡使用ImageField或FileField,但可以這麼說,這對我的應用程序來說是不切實際的。Django Blob模型字段

我試過使用TextField來篡改它,但是當我的二進制數據沒有嚴格確認模型編碼類型(默認情況下是unicode)時,我得到了偶然性錯誤。例如

psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0xe22665 

回答

24

該片段任何良好:

http://djangosnippets.org/snippets/1597/

這可能是用於在 TextField中存儲二進制數據的最簡單的解決方案。

import base64 

from django.db import models 

class Foo(models.Model): 

    _data = models.TextField(
      db_column='data', 
      blank=True) 

    def set_data(self, data): 
     self._data = base64.encodestring(data) 

    def get_data(self): 
     return base64.decodestring(self._data) 

    data = property(get_data, set_data) 

還有其他幾個片段有可能幫助。

+0

謝謝。我一直在使用類似的東西,但是這個片段要簡單得多。 – Cerin 2011-02-07 13:55:36

+3

感謝您的精彩片段。你知道這是否支持過濾?即``Foo.objects.filter(data = my_file)`是否通過`get_data`處理`my_file`? – Patrick 2012-01-03 01:13:09

10

我一直在使用這個簡單的領域「MySQL的後端,你可以修改它的其他後端

class BlobField(models.Field): 
    description = "Blob" 
    def db_type(self, connection): 
     return 'blob' 
19

如果您使用Django> = 1.6,那麼有一個BinaryField