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()
과 동일한 기능을 수행 할 수있는 좋은 방법이 있다면, 나도 몰라 values()
뿐만 아니라 인스턴스 메소드를 호출하여이?!
이 .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_result
와 actual_result
동일한 유형이어야합니다 (예 : 사전).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
어떤 이유로 든 (예 : JSON 직렬화) 네이티브 데이터 유형이 필요한 경우 이것은이를 수행하는 빠른 'n'더러운 방법입니다.
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
보시다시피 목록 안에 dict를 작성하는 것은 실제로 DRY가 아니므로 누군가가 더 나은 방법을 알고 있다면 ...
data = list( blogs )
하고 json.dumps( data )
. 배열은 자바 스크립트 측에 많은 객체와 함께 나옵니다. 파싱이 필요하지 않습니다.
사전이 어떤 모습이어야하는지 정확히 정의하지는 않지만 QuerySet.values()
. 로부터 공식 장고 문서 :
반환 값
ValuesQuerySet
—QuerySet
모델 인스턴스 객체가 아니라 반복 가능으로 사용될 때 사전을 반환 하는 하위 클래스입니다.이러한 각 사전은 모델 개체의 속성 이름에 해당하는 키를 사용하여 개체를 나타냅니다.
목록으로 캐스팅 유형
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
당신이 필요 DjangoJSONEncoder
하고 list
당신하려면 Queryset
에 json
, 심판 : 파이썬 JSON 직렬화 진수 객체를
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
values()
반환 할 필드를 인수로 전달하여 지정합니다 . 또한 값이 목록이 아니라 실제로는 사전 목록을 반환하는 것처럼 보이지만 조심<class 'django.db.models.query.ValuesQuerySet'>
하십시오.