سؤال

عندما أحاول وضع سلسلة 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'>)

هل هناك أي طريقة لإصلاح هذا (بصرف النظر عن الهروب من السلسلة - يجب أن تكون أكثر فعالية للفضاء)؟

هل كانت مفيدة؟

المحلول

كما يقول ماركوس ، سيتعين عليك استخدام Blob إذا كنت ترغب في الاحتفاظ بها بتنسيق ثنائي. إذا كنت موافقًا على ترميزه ، فيمكنك استخدام ترميز BASE64:

from base64 import binascii

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

في اختباراتي الأساسية للغاية مع 33K حرفًا ، كانت سلسلة ZLIB 28 ٪ من حجم السلسلة الأصلية ، وكان سلسلة ZLIB المشفرة BASE64 37 ٪ من حجم السلسلة الأصلية. ليس جيدًا على الضغط ، ولكن لا يزال تحسنًا كبيرًا.

نصائح أخرى

إذا كنت لا ترغب في تشفيره ، فيجب عليك تخزينه ككائن ثنائي (Blob) ، وليس سلسلة. لا يبدو أن Django يدعم Blobfields خارج الصندوق ، لذا اذهب إلى العثور عليه على الشبكة أو اختراق شيئًا معًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top