장고 values_list 대 값


146

Django에서 다음 두 가지의 차이점은 무엇입니까?

Article.objects.values_list('comment_id', flat=True).distinct()

vs

Article.objects.values('comment_id').distinct()

내 목표는 각 아래에 고유 한 주석 ID 목록을 얻는 것입니다 Article. 설명서를 읽었으며 실제로 두 가지 방법을 모두 사용했습니다. 결과는 명백하게 비슷해 보인다.


values_list를 if self.id in Article.objects.values_list('comment_id', flat=True):사용하면 값을 사용 하는 동안 사전에 액세스해야합니다.
dnaranjo

1
@dnaranjo-당신은 왜 할 수는 Article.objects.filter(comment_id=self.id).exists()없습니까?
Sayse

1
그것은 다른 질문에 대한 답입니다
dnaranjo

답변:


250

values()메소드는 사전을 포함하는 QuerySet을 리턴합니다.

<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>

values_list()메소드는 튜플을 포함하는 QuerySet을 리턴합니다.

<QuerySet [(1,), (2,)]>

values_list()단일 필드와 함께 사용 하는 경우 flat=True1- 튜플 대신 단일 값의 QuerySet을 반환하는 데 사용할 수 있습니다 .

<QuerySet [1, 2]>

오, 그리고 두 대의 차이점 distinct()은 어떻습니까?
Hassan Baig

2
아니요, distinct()다르게 작동 한다고 생각하지 않습니다 . 중요한 것은 작업하려는 데이터 구조입니다.
Alasdair

3
이 아닌 a를 values()반환합니다 . 에 의해 반환 된 객체 는처럼 보이지만 경우에 따라 객체 처럼 작동하지 않습니다. 예를 들어,`list '로 변환하지 않으면 JSON 직렬화 가능하지 않습니다QuerySetlistvalues()list
Abhijit Ghate

@AbhijitGhate 좋은 지적, 나는 그것을 명확하게하기 위해 답변을 업데이트했습니다.
Alasdair

2
함수를 values_list사용하여 리턴 값을 실제 파이썬리스트 로 쉽게 변환 할 수 있습니다 list.list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia

55

값 ()

dictionariesiterable로 사용될 때 모델 인스턴스 대신 을 반환하는 QuerySet을 반환합니다 .

values_list ()

list of tuplesiterable로 사용될 때 모델 인스턴스 대신 을 반환하는 QuerySet을 반환합니다 .

뚜렷한()

독특한 eliminate the duplicate요소 에 사용됩니다 .

예:

Article.objects.values_list('id', flat=True) # flat=True will remove the tuples and return the list   
[1, 2, 3, 4, 5, 6]

Article.objects.values('id')
[{'id':1}, {'id':2}, {'id':3}, {'id':4}, {'id':5}, {'id':6}]

2
이 경우에 반환되는 사전 목록입니다values
Hassan Baig

명확히하기 위해 : distinct()데이터베이스가 아닌 쿼리 결과에서 중복 요소를 제거합니다.
oz19

5

다음과 같이 다른 값을 얻을 수 있습니다.

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