Domanda

Quando si tenta di inserire una stringa zlibbed in models.TextField

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

non riesce:

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

C'è un modo per risolvere questo problema (a parte la fuoriuscita della stringa - deve essere spazio-efficiente)

?
È stato utile?

Soluzione

Come Marcus dice, si dovrà utilizzare BLOB se si desidera mantenere in formato binario. Se sei OK con la codifica, è possibile utilizzare la codifica Base64:

from base64 import binascii

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

Nel mio test molto semplici con 33k caratteri, la stringa zlib è stata del 28% la dimensione della stringa originale, i base64 stringa zlib era 37% la dimensione della stringa originale. Non era così buono sulla compressione, ma ancora un grande miglioramento.

Altri suggerimenti

Se non si desidera codificare, bisogna conservarlo come un oggetto binario (BLOB), non è una stringa. Django non sembra supportare BlobFields fuori dalla scatola, in modo da andare a trovarlo in rete o incidere qualcosa insieme.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top