【问题标题】:Django Blob Model FieldDjango Blob 模型字段
【发布时间】:2011-06-22 08:55:33
【问题描述】:

如何使用 Django 的 ORM 和 PostgreSQL 后端存储二进制数据的“blob”?是的,我知道 Django 不赞成这种事情,是的,我知道他们更喜欢你使用 ImageField 或 FileField,但我只想说,这对我的应用程序来说是不切实际的。

我尝试过使用 TextField 来破解它,但是当我的二进制数据没有严格确认模型编码类型(默认情况下为 unicode)时,我偶尔会遇到错误。例如

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

【问题讨论】:

    标签: python django django-models django-orm django-blob


    【解决方案1】:

    如果您使用的是 Django >= 1.6,则有一个 BinaryField

    【讨论】:

      【解决方案2】:

      这个sn-p有什么好处:

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

      这可能是存储二进制数据的最简单的解决方案 文本字段。

      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)
      

      还有一些其他的 sn-ps 可能会有所帮助。

      【讨论】:

      • 谢谢。我一直在使用类似的东西,但是 sn-p 要简单得多。
      • 感谢伟大的 sn-p。你知道这是否支持过滤?即Foo.objects.filter(data=my_file) 是否通过get_data 处理my_file
      【解决方案3】:

      我一直将这个简单的字段用于'mysql'后端,你可以为其他后端修改它

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

      【讨论】:

      • 抱歉没有详细说明,当时我正在调查。从 Django 1.2 开始,db_type 方法采用 connection 参数。这是syncdb 期间异常的原因。我已经修改了代码。
      【解决方案4】:

      另外,请查看Django Storages' Database Storage:

      我还没有使用它,但它看起来很棒,我将在我发布答案后立即开始使用它。

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 2011-07-31
        • 2012-05-13
        • 2019-12-24
        • 2013-02-03
        • 2018-01-01
        • 2011-02-23
        • 2019-12-31
        • 2013-04-09
        相关资源
        最近更新 更多