Django value_list so với giá trị


146

Trong Django, sự khác biệt giữa hai điều sau đây:

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

đấu với

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

Mục tiêu của tôi là để có được một danh sách các id nhận xét duy nhất dưới mỗi Article. Tôi đã đọc tài liệu này (và trên thực tế đã sử dụng cả hai phương pháp). Các kết quả công khai có vẻ tương tự.


Với value_list bạn có thể thực hiện if self.id in Article.objects.values_list('comment_id', flat=True):trong khi sử dụng các giá trị bạn cần để truy cập từ điển
dnaranjo

1
@dnaranjo - Bạn có thể nhưng tại sao không làm Article.objects.filter(comment_id=self.id).exists()?
Sayse

1
Đó là một câu trả lời cho một câu hỏi khác
dnaranjo

Câu trả lời:


250

Các values()phương thức trả về một QuerySet chứa các từ điển:

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

Các values_list()phương thức trả về một QuerySet chứa các bộ:

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

Nếu bạn đang sử dụng values_list()với một trường duy nhất, bạn có thể sử dụng flat=Trueđể trả về Truy vấn của các giá trị đơn thay vì 1-tuples:

<QuerySet [1, 2]>

Oh và không có sự khác biệt giữa hai vis-a-vis distinct()được sử dụng như thế nào hả?
Hassan Baig

2
Không, tôi không nghĩ distinct()làm việc khác đi. Điều quan trọng là cấu trúc dữ liệu mà bạn muốn làm việc với.
Alasdair

3
Trả values()về a QuerySetvà không a list. Mặc dù đối tượng được trả về values()trông giống như một list, nhưng nó không hoạt động như một trong một số trường hợp. Ví dụ, nó sẽ không được nối tiếp json trừ khi chúng tôi chuyển đổi nó thành một 'danh sách'
Abhijit Ghate

@AbhijitGhate điểm tốt, tôi đã cập nhật câu trả lời để làm cho rõ ràng hơn.
Alasdair

2
Bạn có thể dễ dàng chuyển đổi trả về từ values_listmột danh sách Python thực sự chỉ bằng cách sử dụng listchức năng:list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia

54

giá trị ()

Trả về một Bộ truy vấn trả về dictionaries, thay vì các phiên bản mô hình, khi được sử dụng như một lần lặp.

giá trị_list ()

Trả về một Bộ truy vấn trả về list of tuples, thay vì các phiên bản mô hình, khi được sử dụng như một lần lặp.

riêng biệt ()

khác biệt được sử dụng cho eliminate the duplicatecác yếu tố.

Thí dụ:

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
Vì vậy, đó là một danh sách các từ điển được trả lại trong trường hợpvalues
Hassan Baig

Chỉ cần làm rõ: distinct()loại bỏ các yếu tố trùng lặp khỏi kết quả truy vấn, không phải từ cơ sở dữ liệu.
oz19

5

Bạn có thể nhận được các giá trị khác nhau với:

set(Article.objects.values_list('comment_id', flat=True))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.