Frage

Wenn ich versuche, eine zlibbed Zeichenfolge in models.TextField zu setzen

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

es fehlschlägt:

    ...
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'>)

Gibt es eine Möglichkeit, dies zu beheben (außer die Zeichenfolge zu entkommen - es ist platz efficent sein)

?
War es hilfreich?

Lösung

Wie Marcus sagt, müssen Sie BLOB verwenden, wenn Sie es im binären Format behalten möchten. Wenn Sie mit codierende OK sind, können Sie Base64-Codierung verwenden:

from base64 import binascii

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

In meinen sehr grundlegenden Tests mit 33k Zeichen, der zlib-String betrug 28% der Größe der ursprünglichen Zeichenfolge, die zlib-String codiert base64 betrug 37% der Größe der ursprünglichen Zeichenfolge. Nicht ganz so gut auf Druck, aber immer noch eine große Verbesserung.

Andere Tipps

Wenn Sie es nicht kodieren wollen, müssen Sie es als binäres Objekt speichern (BLOB), kein String. Django scheint nicht BlobFields aus dem Kasten heraus zu unterstützen, so gehen sie im Netz finden oder zusammen etwas hacken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top