장고 쿼리셋을 JSON으로 출력하려면 어떻게 해야 합니까?
쿼리셋을 직렬화하고 이 뷰가 출력하는 형식으로 하고 싶습니다.
class JSONListView(ListView):
queryset = Users.objects.all()
def get(self, request, *args, **kwargs):
return HttpResponse(json.dumps({'data': [['bar','foo','bar','foo'],['foo','bar','foo','bar']]}, indent=4), content_type='application/json')
예시의 수동 데이터 대신 쿼리셋을 출력하는 방법을 모르겠습니다.
해봤어요
json.dumps({"data": self.get_queryset()})
그리고.
serializers.serialize("json", {'data': self.get_queryset()})
하지만 작동하지 않을 거야.내가 뭘 잘못하고 있지?커스텀 JSON 인코더를 만들어야 합니까?
JsonResponse를 값과 함께 사용할 수 있습니다.간단한 예:
from django.http import JsonResponse
def some_view(request):
data = list(SomeModel.objects.values()) # wrap in list(), because QuerySet is not JSON serializable
return JsonResponse(data, safe=False) # or JsonResponse({'data': data})
또는 Django의 내장 시리얼라이저를 사용한 또 다른 접근법:
from django.core import serializers
from django.http import HttpResponse
def some_view(request):
qs = SomeModel.objects.all()
qs_json = serializers.serialize('json', qs)
return HttpResponse(qs_json, content_type='application/json')
이 경우 결과는 약간 다릅니다(기본적으로 들여쓰기 없음).
[
{
"model": "some_app.some_model",
"pk": 1,
"fields": {
"name": "Elon",
"age": 48,
...
}
},
...
]
퀴리셋을 연재할 때는 마시멜로 같은 것을 사용하는 것이 좋습니다.
...퍼포먼스 향상을 위한 주의사항:
- 쿼리셋이 큰 경우 페이지네이션 사용;
- 사용하다
objects.values()
연속화 및 클라이언트 모델의 필드로 전송하지 않도록 필수 필드 목록을 지정합니다(통과할 수도 있음).fields
로.serializers.serialize
);
QuerySet은 JSON을 직렬화할 수 없기 때문에 작동하지 않았습니다.
1) 의 경우json.dumps
QuerySet을 JSON 직렬화 가능 개체로 명확하게 변환해야 합니다.
class Model(model.Model):
def as_dict(self):
return {
"id": self.id,
# other stuff
}
또, 시리얼화:
dictionaries = [ obj.as_dict() for obj in self.get_queryset() ]
return HttpResponse(json.dumps({"data": dictionaries}), content_type='application/json')
2) serializer의 경우.직렬화기는 JSON 직렬화 가능 개체 또는 QuerySet 중 하나를 허용하지만 QuerySet을 포함하는 사전은 둘 다 허용하지 않습니다.이것을 시험해 보세요.
serializers.serialize("json", self.get_queryset())
자세한 내용은 이쪽:
https://docs.djangoproject.com/en/dev/topics/serialization/
효율적인 솔루션을 위해 .values() 함수를 사용하여 dict 오브젝트 목록을 가져온 후 이를 json 응답에 덤프할 수 있습니다.JsonResponse(설정 잊지 말 것)safe=False
).
원하는 쿼리셋 오브젝트가 있으면 다음과 같이 JSON 응답으로 변환합니다.
...
data = list(queryset.values())
return JsonResponse(data, safe=False)
필드 이름을 지정할 수 있습니다..values()
원하는 필드만 반환하는 함수입니다(위의 예에서는 json 객체의 모든 모델 필드가 반환됩니다).
로 취득한 쿼리 세트를 반환하려면queryset = Users.objects.all(),
먼저 연재를 해야 합니다
직렬화는 데이터 구조를 다른 구조로 변환하는 프로세스입니다.클래스 베이스 뷰를 사용하면 이렇게 JSON을 반환할 수 있습니다.
from django.core.serializers import serialize
from django.http import JsonResponse
from django.views.generic import View
class JSONListView(View):
def get(self, request, *args, **kwargs):
qs = User.objects.all()
data = serialize("json", qs)
return JsonResponse(data)
그러면 JSON 목록이 출력됩니다.자세한 내용은 제 블로그 기사 "How to return a JSON Response with Django"를 참조하십시오.이것에 대해 어떻게 할 것인지에 대해 더 자세히 설명하겠습니다.
JSON 형식으로 모델에 액세스할 수 있는 API를 구축하는 것이 목표라면django-restframework
그것은 장고 커뮤니티 내에서 이러한 종류의 작업을 달성하기 위해 매우 인기 있는 패키지이다.
여기에는 페이지 표시, 직렬화 정의, 중첩된 모델/관계 등과 같은 유용한 기능이 포함됩니다.사소한 Javascript 태스크와 Ajax 호출만 하고 싶어도 JSON 응답을 수동으로 정의하는 대신 Django Rest Framework를 사용하여 적절한 API를 구축하는 것이 좋습니다.
쿼리셋을 JSON으로 변환하는 또 다른 방법은 루프가 있는 빈 목록에 필요한 요소를 추가하는 것입니다.커스터마이즈 가능한 JSON을 설계할 수 있습니다.
queryset = Users.objects.all()
output = []
for query in queryset:
output.append('id': query.id, 'name': query.name, etc...)
return JSONResponse(output, safe=False)
이것을 시험해 보세요.
class JSONListView(ListView):
queryset = Users.objects.all()
def get(self, request, *args, **kwargs):
data = {}
data["users"] = get_json_list(queryset)
return JSONResponse(data)
def get_json_list(query_set):
list_objects = []
for obj in query_set:
dict_obj = {}
for field in obj._meta.get_fields():
try:
if field.many_to_many:
dict_obj[field.name] = get_json_list(getattr(obj, field.name).all())
continue
dict_obj[field.name] = getattr(obj, field.name)
except AttributeError:
continue
list_objects.append(dict_obj)
return list_objects
from django.http import JsonResponse
def SomeFunction():
dict1 = {}
obj = list( Mymodel.objects.values() )
dict1['data']=obj
return JsonResponse(dict1)
Django에 대해 이 코드를 사용해 보십시오.
언급URL : https://stackoverflow.com/questions/15874233/how-to-output-django-queryset-as-json
'programing' 카테고리의 다른 글
2014년 5월 Oracle v Google 결정으로 인해 문제가 될 수 있는 37개의 Java API 패키지는 무엇입니까? (0) | 2023.03.12 |
---|---|
타이프 스크립트에서 두 날짜 사이의 시간을 계산하려면 어떻게 해야 합니까? (0) | 2023.03.12 |
React 16에서 ReactDOM.createPortal()을 사용하는 방법 (0) | 2023.03.12 |
Mongoose에서 두 개의 OR 쿼리를 AND와 결합합니다. (0) | 2023.03.12 |
SwiftyJSON을 사용한 문자열 배열 해석 방법 (0) | 2023.03.12 |