1. Хрюндель

    01.09.2008 15:35

    Пытаюсь вернуть 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) хотя у меня всё ютфно..

    Кто-нибудь сталкивался?
  2. Dyadya Zed

    01.09.2008 17:09

    Когда-то нашел вот такую удобную функцию где-то в блогах. Код выдран из живых исходников, импортов может быть гораздо меньше :)
    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
  3. Хрюндель

    01.09.2008 19:57

    Dyadya Zed, угу, я тоже её нашёл пока ждал ответа. Вроде отлично работает ))

bbcode