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

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



답변

.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.


답변

.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


답변

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

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

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


답변

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

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

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


답변

목록으로 캐스팅 유형

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

    json.dumps(list(job_reports))


답변

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

이렇게 부르세요-

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


답변

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

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


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