<Аб'ект Джанго> ня JSON серыялізацыі

У мяне ёсць наступны код для серыялізацыі QuerySet;

def render_to_response(self, context, **response_kwargs):

    return HttpResponse(json.simplejson.dumps(list(self.get_queryset())),
                        mimetype="application/json")

And following is my get_querset()

[{'product': , u'_id': u'9802', u'_source': {u'code': u'23981', u'facilities': [{u'facility': {u'name': {u'fr': u'G\xe9n\xe9ral', u'en': u'General'}, u'value': {u'fr': [u'bar', u'r\xe9ception ouverte 24h/24', u'chambres non-fumeurs', u'chambres familiales',.........]}]

Which I need to serialize. But it says not able to serialize the . Because list composed of both django objects and dicts. Any ideas ?

59

8 адказы

simplejson and json don't work with django objects well.

Джанго убудаваны сериализаторов можна толькі серыялізацыі querysets запоўненыя з аб'ектамі Джанго:

data = serializers.serialize('json', self.get_queryset())
return HttpResponse(data, content_type="application/json")

У вашым выпадку, self.get_queryset() змяшчае сумесь аб'ектаў Джанго і dicts ўнутры.

Адзін з варыянтаў, каб пазбавіцца ад асобнікаў мадэлі ў self.get_queryset() і замяніць іх dicts выкарыстоўваючы model_to_dict :

from django.forms.models import model_to_dict

data = self.get_queryset()

for item in data:
   item['product'] = model_to_dict(item['product'])

return HttpResponse(json.simplejson.dumps(data), mimetype="application/json")

Надзея, што дапамагае.

75
дададзена
Я рэдагаваў адказ. Калі ласка, глядзіце, калі гэта дапамагае.
дададзена аўтар alecxe, крыніца
Зараз атрымліваю паведамленне пра памылку -> аб'ект 'NoneType' не мае атрыбуту 'concrete_model' ... І выкарыстоўваючы Django 1.4+
дададзена аўтар tunaktunak, крыніца
Калі мадэль мае DATETIME поле, ён не працуе.
дададзена аўтар ax003d, крыніца

Самы просты спосаб складаецца ў выкарыстанні JsonResponse .

Для QuerySet, вы павінны перадаць спіс у поле значэнне для гэтага QuerySet, напрыклад, так:

from django.http import JsonResponse

queryset = YourModel.objects.filter(some__filter="some value").values()
return JsonResponse({"models_to_return": list(queryset)})
18
дададзена

Самы просты спосаб складаецца ў выкарыстанні JsonResponse .

Для QuerySet, вы павінны перадаць спіс у поле значэнне для гэтага QuerySet, напрыклад, так:

from django.http import JsonResponse

queryset = YourModel.objects.filter(some__filter="some value").values()
return JsonResponse({"models_to_return": list(queryset)})
18
дададзена

Я выявіў, што гэта можна зрабіць даволі проста, выкарыстоўваючы метад «.values», які таксама дае названыя поля:

result_list = list(my_queryset.values('first_named_field', 'second_named_field'))
return HttpResponse(json.dumps(result_list))

«Спіс» павінен быць выкарыстаны для атрымання дадзеных як Iterable, так як тып «значэнне QuerySet» толькі дыктуюць калі ўзялі ў якасці итератора.

Documentation: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#values

14
дададзена
Гэта добра працавала для мяне. Нават калі паведамленне пра памылку паказвае, што ўсё ў адным вялікім спісе, спіс() па-ранейшаму, па-відаць неабходна.
дададзена аўтар trpt4him, крыніца
Найпростае і самае лепшае рашэнне
дададзена аўтар Timur, крыніца

Я выявіў, што гэта можна зрабіць даволі проста, выкарыстоўваючы метад «.values», які таксама дае названыя поля:

result_list = list(my_queryset.values('first_named_field', 'second_named_field'))
return HttpResponse(json.dumps(result_list))

«Спіс» павінен быць выкарыстаны для атрымання дадзеных як Iterable, так як тып «значэнне QuerySet» толькі дыктуюць калі ўзялі ў якасці итератора.

Documentation: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#values

14
дададзена
Гэта добра працавала для мяне. Нават калі паведамленне пра памылку паказвае, што ўсё ў адным вялікім спісе, спіс() па-ранейшаму, па-відаць неабходна.
дададзена аўтар trpt4him, крыніца
Найпростае і самае лепшае рашэнне
дададзена аўтар Timur, крыніца

Па-першае, я дадаў метад to_dict да маёй мадэлі;

def to_dict(self):
    return {"name": self.woo, "title": self.foo}

Тады ў мяне ёсць гэта;

class DjangoJSONEncoder(JSONEncoder):

    def default(self, obj):
        if isinstance(obj, models.Model):
            return obj.to_dict()
        return JSONEncoder.default(self, obj)


dumps = curry(dumps, cls=DjangoJSONEncoder)

і, нарэшце, выкарыстоўваць гэты клас для серыялізацыі майго QuerySet.

def render_to_response(self, context, **response_kwargs):
    return HttpResponse(dumps(self.get_queryset()))

Гэта працуе вельмі добра

5
дададзена

Пачынаючы з версіі 1.9 Лягчэй і афіцыйны спосаб атрымання JSON

from django.http import JsonResponse
from django.forms.models import model_to_dict


return JsonResponse(  model_to_dict(modelinstance) )
4
дададзена

Пачынаючы з версіі 1.9 Лягчэй і афіцыйны спосаб атрымання JSON

from django.http import JsonResponse
from django.forms.models import model_to_dict


return JsonResponse(  model_to_dict(modelinstance) )
4
дададзена