Django QuerySet을 dict 목록으로 어떻게 변환합니까?


122

Django QuerySet을 dict 목록으로 변환하려면 어떻게해야합니까? 나는 이것에 대한 답을 찾지 못했기 때문에 모든 사람들이 사용하는 일종의 일반적인 도우미 기능을 놓치고 있는지 궁금합니다.

답변:


176

.values()방법을 사용하십시오 :

>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]

참고 : 결과는 QuerySet대부분 목록처럼 작동하지만 실제로 list. list(Blog.objects.values(…))의 인스턴스가 정말로 필요한 경우 사용하십시오 list.


7
예, values()반환 할 필드를 인수로 전달하여 지정합니다 . 또한 값이 목록이 아니라 실제로는 사전 목록을 반환하는 것처럼 보이지만 조심 <class 'django.db.models.query.ValuesQuerySet'>하십시오.
dm03514

10
이것은 실제로 목록하지만 반환하지 않습니다
astreltsov

또한, 당신이 개체의 인스턴스 메소드의 결과를 얻을 기운 values()과 동일한 기능을 수행 할 수있는 좋은 방법이 있다면, 나도 몰라 values()뿐만 아니라 인스턴스 메소드를 호출하여이?!
Asara

34

.values()메서드 ValuesQuerySet는 일반적으로 대부분의 경우에 필요한 유형의 결과를 반환합니다 .

그러나 원하는 경우 ValuesQuerySet아래 예제와 같이 Python 목록 이해를 사용하여 네이티브 Python 목록으로 전환 할 수 있습니다.

result = Blog.objects.values()             # return ValuesQuerySet object
list_result = [entry for entry in result]  # converts ValuesQuerySet into Python list
return list_result

나는 함수의 기대 수익 값이 실제 리턴 값과 일치하는지 당신이있는 경우 모두 주장 단위 테스트와 필요를 작성하는 경우 위의 도움이 찾을 수 expected_resultactual_result동일한 유형이어야합니다 (예 : 사전).

actual_result = some_function()
expected_result = {
    # dictionary content here ...
}
assert expected_result == actual_result

17
또는이와 함께 목록에 변환 단순화 할 수 있습니다list(result)
Adiyat 무바라크에게

12

어떤 이유로 든 (예 : JSON 직렬화) 네이티브 데이터 유형이 필요한 경우 이것은이를 수행하는 빠른 'n'더러운 방법입니다.

data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]

보시다시피 목록 안에 dict를 작성하는 것은 실제로 DRY가 아니므로 누군가가 더 나은 방법을 알고 있다면 ...


나는 그것을 작업 가지고하는 것 data = list( blogs )하고 json.dumps( data ). 배열은 자바 스크립트 측에 많은 객체와 함께 나옵니다. 파싱이 필요하지 않습니다.
Arthur Tarasov

3

사전이 어떤 모습이어야하는지 정확히 정의하지는 않지만 QuerySet.values(). 로부터 공식 장고 문서 :

반환 값 ValuesQuerySetQuerySet모델 인스턴스 객체가 아니라 반복 가능으로 사용될 때 사전을 반환 하는 하위 클래스입니다.

이러한 각 사전은 모델 개체의 속성 이름에 해당하는 키를 사용하여 개체를 나타냅니다.


2

목록으로 캐스팅 유형

    job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')

    json.dumps(list(job_reports))

1

사용할 수 있습니다 values()쿼리를 수행하는 Django 모델 필드에서 얻은 dict에 메서드를 인덱스 값으로 각 필드에 쉽게 액세스 할 수 있습니다.

이렇게 부르세요-

myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...

1

당신이 필요 DjangoJSONEncoder하고 list당신하려면 Querysetjson, 심판 : 파이썬 JSON 직렬화 진수 객체를

import json
from django.core.serializers.json import DjangoJSONEncoder


blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)


0

다음과 같이 model_to_dict를 사용하여 함수를 정의 할 수 있습니다.

def queryset_to_dict(qs,fields=None, exclude=None):
    my_array=[]
    for x in qs:
        my_array.append(model_to_dict(x,fields=fields,exclude=exclude))
    return my_array
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.