[python] Django에서 모델 인스턴스를 어떻게 직렬화합니까?

모델 QuerySet을 직렬화하는 방법에 대한 많은 문서가 있지만 모델 인스턴스의 필드를 JSON으로 직렬화하는 방법은 무엇입니까?



답변

목록을 사용하여 필요한 객체를 쉽게 래핑 할 수 있으며 장고 시리얼 라이저가 올바르게 직렬화하는 데 필요한 모든 것입니다.

from django.core import serializers

# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])


답변

모델 인스턴스 목록을 다루는 가장 좋은 serializers.serialize()방법은를 사용 하는 것입니다. 필요에 완벽하게 맞습니다.

그러나 개체가 아닌 단일 개체 를 직렬화하려고 할 때 문제가 발생 list합니다. 이렇게하면 다른 핵을 제거하기 위해 Django를 사용하십시오 model_to_dict(실수하지 않은 경우 serializers.serialize()의존합니다).

from django.forms.models import model_to_dict

# assuming obj is your model instance
dict_obj = model_to_dict( obj )

이제 json.dumpsjson으로 직렬화 하려면 한 번만 호출하면됩니다.

import json
serialized = json.dumps(dict_obj)

그게 다야! 🙂


답변

배열 랩퍼를 피하려면 응답을 리턴하기 전에 제거하십시오.

import json
from django.core import serializers

def getObject(request, id):
    obj = MyModel.objects.get(pk=id)
    data = serializers.serialize('json', [obj,])
    struct = json.loads(data)
    data = json.dumps(struct[0])
    return HttpResponse(data, mimetype='application/json')

주제에 대한이 흥미로운 게시물을 발견했습니다.

http://timsaylor.com/convert-django-model-instances-to-dictionaries

django.forms.models.model_to_dict를 사용하는데 이는 작업을위한 완벽한 도구처럼 보입니다.


답변

이것에 대한 좋은 대답이 있으며 언급되지 않은 것에 놀랐습니다. 몇 줄로 날짜, 모델 및 기타 모든 것을 처리 할 수 ​​있습니다.

모델을 처리 할 수있는 사용자 지정 인코더를 만듭니다.

from django.forms import model_to_dict
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import Model

class ExtendedEncoder(DjangoJSONEncoder):

    def default(self, o):

        if isinstance(o, Model):
            return model_to_dict(o)

        return super().default(o)

이제 json.dumps를 사용할 때 사용하십시오.

json.dumps(data, cls=ExtendedEncoder)

이제 모델, 날짜 및 모든 항목을 직렬화 할 수 있으며 배열 또는 직렬화 및 직렬화하지 않아도됩니다. 당신이 가진 것은 모두 사용자 정의 default메소드에 추가 할 수 있습니다 .

Django의 네이티브 JsonResponse를 다음과 같이 사용할 수도 있습니다.

from django.http import JsonResponse

JsonResponse(data, encoder=ExtendedEncoder)
``


답변

당신이 요구하는 것은 상호 운용성을 위해 Django 모델 인스턴스의 데이터 구조를 직렬화하는 것과 관련이 있습니다. 다른 포스터는 정확합니다 .Django의 api를 통해 데이터베이스를 쿼리 할 수있는 파이썬 응용 프로그램에서 직렬화 된 양식을 사용하려면 하나의 객체로 쿼리 세트를 직렬화하고 싶습니다. 반면에 데이터베이스를 건드 리거나 장고를 사용하지 않고 모델 인스턴스를 다른 곳에 다시 팽창시키는 방법이 필요한 경우 약간의 작업이 필요합니다.

내가하는 일은 다음과 같습니다.

먼저 demjson변환에 사용 합니다. 내가 처음 찾은 것이었지만 최고가 아닐 수도 있습니다. 구현은 해당 기능 중 하나에 의존하지만 다른 변환기와 비슷한 방법이 있어야합니다.

둘째, json_equivalent직렬화가 필요한 모든 모델에 메소드를 구현하십시오 . 이것은 마법의 방법 demjson이지만, 어떤 구현을 선택하든 생각하고 싶을 것입니다. 아이디어는 직접 변환 할 수있는 객체 json(예 : 배열 또는 사전) 를 반환한다는 것 입니다. 실제로 자동으로 수행하려면 다음을 수행하십시오.

def json_equivalent(self):
    dictionary = {}
    for field in self._meta.get_all_field_names()
        dictionary[field] = self.__getattribute__(field)
    return dictionary

완전히 평평한 데이터 구조를 갖지 않는 한 ( ForeignKeys데이터베이스의 숫자와 문자열 등) 가 아니면 도움이되지 않습니다 . 그렇지 않으면이 방법을 구현하는 올바른 방법에 대해 진지하게 생각해야합니다.

셋째, 전화 demjson.JSON.encode(instance)하면 원하는 것을 가질 수 있습니다.


답변

모델에서 단일 객체를 직렬화하는 방법을 묻고 쿼리 세트에서 객체를 하나만 얻는다는 것을 알고 있다면 (예 : objects.get 사용) 다음과 같은 것을 사용하십시오.

import django.core.serializers
import django.http
import models

def jsonExample(request,poll_id):
    s = django.core.serializers.serialize('json',[models.Poll.objects.get(id=poll_id)])
    # s is a string with [] around it, so strip them off
    o=s.strip("[]")
    return django.http.HttpResponse(o, mimetype="application/json")

어떤 형태의 것을 얻을 수 있습니다 :

{"pk": 1, "model": "polls.poll", "fields": {"pub_date": "2013-06-27T02:29:38.284Z", "question": "What's up?"}}


답변

모델에 직렬화 방법을 추가하여이 문제를 해결했습니다.

def toJSON(self):
    import simplejson
    return simplejson.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))

한 줄짜리를 싫어하는 사람들에 대한 자세한 내용은 다음과 같습니다.

def toJSON(self):
    fields = []
    for field in self._meta.fields:
        fields.append(field.name)

    d = {}
    for attr in fields:
        d[attr] = getattr(self, attr)

    import simplejson
    return simplejson.dumps(d)

_meta.fields 인스턴스와 모델 자체에서 액세스 할 수있는 정렬 된 모델 필드 목록입니다.