2011-02-06 134 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