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)
에 대한 자세한 내용을 참조해 주세요.default
method, 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
'programing' 카테고리의 다른 글
기본 인증을 위한 올바른 인증 헤더를 보내는 방법 (0) | 2023.03.17 |
---|---|
Wordpress에서 다른 관리 페이지로 리디렉션하는 방법 (0) | 2023.03.17 |
Angularjs 멀티파트 폼 데이터 및 파일 업로드 방법 (0) | 2023.03.17 |
@SpringBootApplication을 STS 유형으로 해결할 수 없음 (0) | 2023.03.17 |
PHP, jQuery 및 AJAX를 사용하여 여러 파일을 업로드하는 방법 (0) | 2023.03.17 |