programing

JSON simplejson을 사용한 장고 모델 시리얼화

muds 2023. 3. 17. 22:02
반응형

JSON simplejson을 사용한 장고 모델 시리얼화

장고 모델을 simplejson으로 연재하고 싶습니다.장고의 시리얼라이저는 사전을 지원하지 않습니다...simplejson은 Django Querysets를 지원하지 않습니다.이것은 상당한 난제입니다.

모델에는 스폰서 레벨의 Foreign Key를 가지는 스폰서가 있어, 특정 스폰서 레벨의 스폰서를 모두 정리하려고 합니다.목록을 생성하는 코드는 다음과 같습니다.

from django.shortcuts import get_list_or_404
from special_event.models import Sponsor, SponsorLevel

sponsor_dict = {}

roadie_sponsors = get_list_or_404(Sponsor, level__category = SponsorLevel.ROADIE_CHOICE)

for item in roadie_sponsors:
    try:
        sponsor_dict[item.level.name].append(item)
    except KeyError:
        sponsor_dict[item.level.name] = [item]

이게 뭐냐면sponsor_dict일단 '만든' 것처럼 보인다

{
    'Fan': [<Sponsor: Fan Sponsor>], 
    'VIP': [<Sponsor: VIP Sponsor>],
    'Groupie': [<Sponsor: Groupie Sponsor>],
    'Silver': [<Sponsor: Silver Sponsor>],
    'Bronze': [<Sponsor: Another Bronze Sponsor>, <Sponsor: Bronze Sponsor>]
}

브론즈를 제외하고 각 레벨에 스폰서를 1명 추가했을 뿐입니다.그것은 어떻게 동작하는지를 보여주기 위해서입니다.jQuery가 쉽게 해석할 수 있도록 JSON에 "모두" 입력하기만 하면 됩니다.Django의 다른 시리얼라이저(XML이나 YAML 등)는 이를 실현할 수 있습니까?사전을 처리하기 위해 Django JSON Serializer를 "확장"하거나 Django QuerySet 개체를 처리하기 위해 simplejson을 "확장"할 수 있습니까?

저는 심플존을 연장하는 것으로 하겠습니다.기본적으로는 JSON 인코더가 QuerySet을 검출했을 때 django의 시리얼라이제이션에 접속합니다.다음과 같은 것을 사용할 수 있습니다.

from json import dumps, loads, JSONEncoder

from django.core.serializers import serialize
from django.db.models.query import QuerySet
from django.utils.functional import curry

class DjangoJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, QuerySet):
            # `default` must return a python serializable
            # structure, the easiest way is to load the JSON
            # string produced by `serialize` and return it
            return loads(serialize('json', obj))
        return JSONEncoder.default(self,obj)

# partial function, we can now use dumps(my_dict) instead
# of dumps(my_dict, cls=DjangoJSONEncoder)
dumps = curry(dumps, cls=DjangoJSONEncoder)

에 대한 자세한 내용을 참조해 주세요.defaultmethod, simplejson 문서를 참조하십시오.python 모듈에 넣은 다음dumps이제 가도 돼단, 이 함수는 시리얼화에만 도움이 됩니다.QuerySet인스턴스, 비인스턴스Model인스턴스가 직접 표시됩니다.

django에서 대부분의 구조를 시리얼화하는 매우 유연한 방법은 여기서 수 있는 시리얼라이저 클래스를 사용하는 것입니다.

클레멘트의 답변을 바탕으로 JSON에도 모델을 넣기 위해 이렇게 했습니다.

def toJSON(obj):
   if isinstance(obj, QuerySet):
       return simplejson.dumps(obj, cls=DjangoJSONEncoder)
   if isinstance(obj, models.Model):
       #do the same as above by making it a queryset first
       set_obj = [obj]
       set_str = simplejson.dumps(simplejson.loads(serialize('json', set_obj)))
       #eliminate brackets in the beginning and the end 
       str_obj = set_str[1:len(set_str)-2]
   return str_obj

언급URL : https://stackoverflow.com/questions/2249792/json-serializing-django-models-with-simplejson

반응형