Как правильно отформатировать объект StringIO (python и django) для вставки в базу данных? - PullRequest
4 голосов
/ 12 октября 2010

У меня есть требование хранить изображения в базе данных, используя 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

Я уже внедрил пользовательскую систему хранения для обработки хранения / извлечения изображений с использованием пользовательской модели (которая содержит вышеуказанный BlobField). Параметр 'value' в методе 'get_db_prep_value' является объектом 'StringIO', который содержит двоичные данные изображения. Суть в том, что я не знаю, что возвращать в методе get_db_prep_value, поскольку объект StringIO наверняка будет содержать непечатаемые символы.

У меня есть несколько вопросов о проблеме:

  • Что я должен вернуть в методе get_db_prep_value?
  • Если ожидаемое значение является строкой ASCII, могу ли я представить большой двоичный объект (шестнадцатеричные экранирования) независимым от базы данных способом?
  • Если нет, то есть ли встроенные библиотеки, которые обрабатывают этот тип преобразования для меня?
  • Что я могу получить в качестве входных данных для метода 'to_python' и как я могу преобразовать его в объект StringIO?

1 Ответ

13 голосов
/ 14 октября 2010

Нет ограничения, требующего get_db_prep_value для возврата "печатаемых" символов, или символов ASCII, или наборов символов с иным ограничением: возвращает любую байтовую строку, которая вас заинтересует. Вы получите строку в to_python и сможете создать файлоподобный экземпляр StringIO, считывающий его данные с помощью the_instance = StringIO.StringIO(value) (конечно, вам потребуется import StringIO в верхней части вашего модуля).

...