Django Blob 模型字段

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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:。

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

【讨论】:

以上是关于Django Blob 模型字段的主要内容,如果未能解决你的问题,请参考以下文章

django模型,如何动态设置查询的字段?

Django 模型字段依赖于另一个模型字段

Django - 基于另一个字段更新模型字段

Django模型将字段与字段进行比较[重复]

Django 忽略模型字段

根据另一个字段的值验证 Django 模型字段?