#9952 closed (wontfix)
to_python being called with unicode text breaks Unpickler
Reported by: | Mark Jones | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.0 |
Severity: | Keywords: | CustomFields | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I have a database column that contains a pickle. When the model tries to access it as a custom field, I run into this problem:
>>> QuizQuestion.objects.get(pk=1) class= <type 'unicode'> (I1 I2 I3 I4 tp0 . Traceback (most recent call last): File "<console>", line 1, in <module> File "c:\Python25\Lib\site-packages\django\db\models\manager.py", line 93, in get return self.get_query_set().get(*args, **kwargs) File "c:\Python25\Lib\site-packages\django\db\models\query.py", line 304, in get num = len(clone) File "c:\Python25\Lib\site-packages\django\db\models\query.py", line 160, in __len__ self._result_cache = list(self.iterator()) File "c:\Python25\Lib\site-packages\django\db\models\query.py", line 280, in iterator obj = self.model(*row[index_start:]) File "c:\Python25\Lib\site-packages\django\db\models\base.py", line 213, in __init__ setattr(self, field.attname, val) File "c:\Python25\Lib\site-packages\django\db\models\fields\subclassing.py", line 32, in __set__ obj.__dict__[self.field.name] = self.field.to_python(value) File "P:\home\mark\Python\intomec\..\intomec\tenq\models.py", line 42, in to_python return pickle.loads(value) File "c:\Python25\lib\pickle.py", line 1374, in loads return Unpickler(file).load() File "c:\Python25\lib\pickle.py", line 858, in load dispatch[key](self) KeyError: '\x00' >>>
the class= part (right before the Traceback) is printed by the class right before the problem in pickle.loadds
Why is the db output converted into unicode before to_python is called? the KeyError is because the Unpickler expects a bytestream, not a unicode stream.....
Change History (2)
follow-up: 2 comment:1 by , 16 years ago
Resolution: | → wontfix |
---|---|
Status: | new → closed |
comment:2 by , 16 years ago
The following works well for unpickling if you don't want to modify the field:
object = loads(pickledstring.encode('utf-8'))
Note:
See TracTickets
for help on using tickets.
I suspect this is because you're putting pickle data into a
TextField
orCharField
, which expects text, not binary. If you're storing pickled data, you'll want to write a custom field (http://docs.djangoproject.com/en/dev/howto/custom-model-fields/).If you're not using a
TextField
/CharField
, please feel free to reopen.