Злиб в базе данных - Джанго - PullRequest
1 голос
/ 17 мая 2009

Когда я пытаюсь поместить строку zlibbed в модели. TextField

>>> f = VCFile(head = 'blahblah'.encode('zlib'))
>>> f.save()

не получается:

    ...
raise DjangoUnicodeDecodeError(s, *e.args)
DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0x9c in position 1: unexpected code byte. You passed in 'x\x9cK\xcaI\xccH\x02b\x00\x0eP\x03/' (<type 'str'>)

Есть ли способ исправить это (кроме экранирования строки - это должно быть эффективно по пространству)?

Ответы [ 2 ]

1 голос
/ 18 мая 2009

Как говорит Маркус, вам придется использовать BLOB, если вы хотите сохранить его в двоичном формате. Если с кодировкой все в порядке, вы можете использовать кодировку base64:

from base64 import binascii

f = VCFile(head = binascii.b2a_base64('blahblah'.encode('zlib')))

В моих очень простых тестах с 33k символами строка zlib составляла 28% размера исходной строки, строка zlib в кодировке base64 была 37% размера исходной строки. Не совсем хорошо для сжатия, но все же большое улучшение.

0 голосов
/ 17 мая 2009

Если вы не хотите кодировать его, вы должны сохранить его как двоичный объект (BLOB), а не как строку. Django, похоже, не поддерживает BlobFields из коробки, поэтому найдите его в сети или взломайте что-нибудь вместе.

...