1

zlibbed 文字列を models.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'>)

これを修正する方法はありますか (文字列をエスケープする以外に、スペースを効率的に使用する必要があります)。

4

2 に答える 2

2

マーカスが言うように、バイナリ形式で保持したい場合は、BLOBを使用する必要があります。エンコードに問題がない場合は、base64エンコードを使用できます。

from base64 import binascii

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

33k文字を使用した非常に基本的なテストでは、zlib文字列は元の文字列の28%のサイズであり、base64でエンコードされたzlib文字列は元の文字列の37%のサイズでした。圧縮に関してはそれほど良くはありませんが、それでも大きな改善があります。

于 2009-05-18T16:59:28.347 に答える
0

エンコードしたくない場合は、文字列ではなく、バイナリ オブジェクト (BLOB) として格納する必要があります。Django はそのままでは BlobFields をサポートしていないようです。そのため、ネットで検索するか、一緒に何かをハックしてください。

于 2009-05-17T18:24:58.183 に答える