59👍
Querysets are not serializable out-of-the-box. If you try list(self.items)
instead of just self.items
, that should work as long as the items themselves are JSON-serializable.
Update: It will raise an exception even if it isn’t empty. I don’t think it’ll be accepted as a Django bug, though of course you can try; the simplest answer is to force evaluation using list(qs)
, as I’ve already said.
6👍
This is very frustrating. Django’s serialization complains about everything that isn’t a query set and json.dumps complains about objects from Django’s ORM support.
>>> from cluster.models import Account
>>> import json
>>> json.dumps(Account.objects.all()[0])
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Account: 9de5-2653-000d-81a3 => foo@bar.net> is not JSON serializable
Versus
>>> serializers.serialize("json", [clusters])
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 91, in serialize
s.serialize(queryset, **options)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/base.py", line 41, in serialize
for field in obj._meta.local_fields:
AttributeError: 'QuerySet' object has no attribute '_meta'
- [Django]-Django edit form based on add form?
- [Django]-How to get getting base_url in django template
- [Django]-Silence tqdm's output while running tests or running the code via cron
4👍
As Vinay pointed out, even if you cast to a list, serialization often still fails. For me, serialization fails on DateTimeField elements (datetime.datetime
objects), even if I ask for a ValuesQuerySet
(list-like) with .values()
. The solution for me was a simple comprehension.
json.dumps([str(obj) for obj in Model.objects.values()]);
In your case, that would be
return json.dumps({k: str(v) for k, v in self.__dict__.items()})
The magic of str
saves the day. The repr
built-in may also be helpful if you need object type information in your serialization.
- [Django]-When should you use django-admin.py versus manage.py?
- [Django]-How to use Python type hints with Django QuerySet?
- [Django]-Django set range for integer model field as constraint