단일 필드를 선택하는 장고 모델


103

호출 된 테이블 / 모델 Employees이 있고 단일 필드의 모든 행을 쿼리 세트로 가져오고 싶습니다.

나는 내가 이것을 할 수 있다는 것을 안다 (내가 이것을 올바르게하고 있기를 바랍니다) :

emp_list = Employees.objects.get(all)
emp_names = emp_list.eng_name

모든 필드에 대해 데이터베이스를 쿼리하고 하나만 사용합니까? 더 나은 (더 빠른) 방법이 있습니까?


"하나만 사용"이란 무엇을 의미합니까? SELECT col대신 SELECT *?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


188
Employees.objects.values_list('eng_name', flat=True)

모든 eng_names의 단순 목록을 만듭니다 . 한 행에 둘 이상의 필드를 원하면 단순 목록을 수행 할 수 없습니다. 이렇게하면 튜플 목록이 생성됩니다.

Employees.objects.values_list('eng_name', 'rank')

답을 주셔서 감사합니다. 하나 이상의 필드 (모두가 아님) 만 선택하려면 어떻게해야합니까?
zentenk

죄송합니다. 질문을 이해할 수 없습니다.
Daniel Roseman 2011 년

4
공유하십시오 document.that의 의지는 다른 사람에게 도움이
밥 마티

26

이외에도 values_list으로 다니엘이 언급 당신은 또한 사용할 수 있습니다 only(또는 defer반대의 효과에 대한) 그들의 ID와 지정된 필드를 가지는 객체의 검색어를 얻을 수 있습니다 :

Employees.objects.only('eng_name')

이렇게하면 단일 쿼리가 실행됩니다.

SELECT id, eng_name FROM employees

3
이 명령은 내 Django 버전 2.1.3 및 python 버전 3.6.2의 모든 필드를 반환합니다.
Ananthi

이 파일 만 가져 오지만 다른 필드에 액세스하려고하면 별도의 데이터베이스 쿼리가 실행됩니다. 따라서 이것은 좋은 최적화 기술이지만 이러한 추가 쿼리를 생성하지 않도록하십시오. 그렇지 않으면 성능을 얻는 대신 성능을 잃게됩니다.
Eerik Sven Puudist

6

값보다 필수 필드를 선택할 수 있습니다.

Employee.objects.all().values('eng_name','rank')

쿼리가 성공적으로 실행 된 후 변수에 필드 값을 저장하는 방법 (예 : var_name = <query_name>. <field_name> ?
user12379095

@ user12379095 그냥 이렇게 :var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan

@ user12379095를 입력 한 다음이 var_name을 사용하려면-예 : 모든 직원 이름과 순위를 인쇄하면 다음과 같이 할 수 있습니다.for person in var_name: print(person['eng_name'] + " " + person['rank'])
theQuestionMan

3

Oskar Persson의 답변은 데이터를 컨텍스트 에 전달하고 일반 값 목록 대신 개체 인스턴스 (소품을 쉽게 반복 할 수 있음)를 가져올 때 템플릿 에서 정상적으로 처리하는 것이 더 쉬워지기 때문에이를 처리하는 가장 좋은 방법 입니다.

그 후 원하는 소품을 쉽게 얻을 수 있습니다.

for employee in employees:
    print(employee.eng_name)

또는 템플릿에서 :

{% for employee in employees %}

    <p>{{ employee.eng_name }}</p>

{% endfor %}

1

다음과 같이 필터와 함께 values_list를 사용할 수 있습니다.

active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)

자세한 내용은 여기


0

Daniel 대답은 그 자리에서 옳습니다. 둘 이상의 필드를 쿼리하려면 다음을 수행하십시오.

Employee.objects.values_list('eng_name','rank')

그러면 튜플 목록이 취소됩니다. 둘 이상의 필드를 쿼리 할 때는 named = Ture를 사용할 수 없습니다.

또한 해당 정보와 함께 하나의 필드 만 존재하고 pk ID를 알고 있다면 다음을 수행하십시오.

Employee.objects.values_list('eng_name','rank').get(pk=1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.