python - 如何正确格式化要插入数据库的 StringIO 对象(python 和 django)?

标签 python django django-models

我有一个使用 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 对象?

最佳答案

没有任何约束要求 get_db_prep_value 返回“可打印”字符、ASCII 字符或其他受约束的字符集:返回您喜欢的任何字节字符串。您将在 to_python 中获得一个字符串,并可以创建一个类似文件的 StringIO 实例,使用 the_instance = StringIO.StringIO(value) 读取其数据(当然,您需要在模块顶部import StringIO)。

关于python - 如何正确格式化要插入数据库的 StringIO 对象(python 和 django)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915888/

相关文章:

python - 为什么在同一个变量的语句中使用多个等号?

python - 如何在 django rest 框架中验证模型?

python - 如何提高 django mysql 复制性能?

python - Django .aggregate() 在 .annotate() 上

django - 我可以让 Django 忽略非 PK 唯一约束上的重复装置吗?

python - 数据框对象没有属性

python - 将十六进制字符串文件转换为整数的最佳方法

python - 什么chromedriver支持Chrome浏览器版本81.0.4044.122?

django - 具有基于类的 View 的多个表单。如何在同一页面显示错误?

Django 1.4.1 和在反序列化中使用自然键