programing

장고 쿼리셋을 JSON으로 출력하려면 어떻게 해야 합니까?

batch 2023. 3. 12. 10:36
반응형

장고 쿼리셋을 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.dumpsQuerySet을 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

반응형