-
Пытаюсь вернуть qs в виде JSON. В документации написано делать это вот таким образом
json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(queryset, ensure_ascii=False, stream=response)
И тут у меня возникает сразу две проблемы:
1. Моя модель это сабкласс модели User и почему-то в результате я вижу только поля моей модели, но нет полей от модели User.
2. Если в результате есть русские символы, ругается на 'ascii' codec can't encode characters in position 1-8: ordinal not in range(128) хотя у меня всё ютфно..
Кто-нибудь сталкивался? -
Когда-то нашел вот такую удобную функцию где-то в блогах. Код выдран из живых исходников, импортов может быть гораздо меньше :)
from django.http import HttpResponse
from django.utils import simplejson
from django.shortcuts import render_to_response
from django.template import RequestContext
import types
from django.db import models
from django.utils import simplejson as json
from django.core.serializers.json import DateTimeAwareJSONEncoder
from decimal import *
def json_encode(data):
"""
The main issues with django's default json serializer is that properties that
had been added to a object dynamically are being ignored (and it also has
problems with some models).
"""
def _any(data):
ret = None
if type(data) is types.ListType:
ret = _list(data)
elif type(data) is types.DictType:
ret = _dict(data)
elif isinstance(data, Decimal):
# json.dumps() cant handle Decimal
ret = str(data)
elif isinstance(data, models.query.QuerySet):
# Actually its the same as a list ...
ret = _list(data)
elif isinstance(data, models.Model):
ret = _model(data)
else:
ret = data
return ret
def _model(data):
ret = {}
# If we only have a model, we only want to encode the fields.
for f in data._meta.fields:
ret[f.attname] = _any(getattr(data, f.attname))
# And additionally encode arbitrary properties that had been added.
fields = dir(data.__class__) + ret.keys()
add_ons = [k for k in dir(data) if k not in fields]
for k in add_ons:
ret[k] = _any(getattr(data, k))
return ret
def _list(data):
ret = []
for v in data:
ret.append(_any(v))
return ret
def _dict(data):
ret = {}
for k,v in data.items():
ret[k] = _any(v)
return ret
ret = _any(data)
return ret -
Dyadya Zed, угу, я тоже её нашёл пока ждал ответа. Вроде отлично работает ))
