mô hình django chọn trường đơn


102

Tôi có một bảng / các mô hình được gọi Employeesvà tôi muốn nhận tất cả các hàng của một trường dưới dạng tập truy vấn.

Tôi biết tôi có thể làm điều đó như thế này (hy vọng tôi đang làm điều này ngay cả):

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

Có truy vấn cơ sở dữ liệu cho tất cả các trường và chỉ sử dụng một trường không? Có cách nào tốt hơn (nhanh hơn) để làm điều này không?


Ý bạn là gì khi "và chỉ sử dụng một"? A SELECT colthay vì SELECT *?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Câu trả lời:


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

Điều đó tạo ra một danh sách phẳng gồm tất cả các eng_names. Nếu bạn muốn có nhiều trường trên mỗi hàng, bạn không thể tạo danh sách phẳng: điều này sẽ tạo một danh sách các bộ giá trị:

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

cảm ơn vì câu trả lời, nếu tôi chỉ muốn chọn 1 hoặc nhiều trường (không phải tất cả) thì sao?
zentenk

Xin lỗi, tôi không hiểu câu hỏi.
Daniel Roseman

3
xin vui lòng chia sẻ document.that sẽ giúp cho những người khác
bob marti

25

Ngoài values_listnhư Daniel đã đề cập, bạn cũng có thể sử dụng only(hoặc defercho tác dụng ngược lại) để lấy tập hợp các đối tượng chỉ có id của chúng và các trường được chỉ định:

Employees.objects.only('eng_name')

Điều này sẽ chạy một truy vấn duy nhất:

SELECT id, eng_name FROM employees

3
Lệnh này trả về cho tôi tất cả các trường cho phiên bản Django 2.1.3 và phiên bản python 3.6.2 của tôi.
Ananthi

Nó sẽ chỉ tìm nạp một tệp này, nhưng nếu bạn cố gắng truy cập các trường khác, một truy vấn cơ sở dữ liệu riêng biệt sẽ được thực thi. Vì vậy, đây là một kỹ thuật tối ưu hóa tốt, nhưng hãy đảm bảo rằng bạn không tạo thêm các truy vấn này. Nếu không, bạn sẽ mất hiệu suất thay vì đạt được nó.
Eerik Sven Puudist

6

Chúng tôi có thể chọn các trường bắt buộc trên các giá trị.

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

Sau khi truy vấn được chạy thành công, làm thế nào để lưu trữ giá trị của một trường trong một biến, ví dụ. var_name = <query_name>. <field_name> ?
user12379095

@ user12379095 chỉ đơn giản như thế này:var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan

@ user12379095 và sau đó để sử dụng var_name này - ví dụ: in tất cả tên nhân viên và xếp hạng, bạn có thể thực hiện việc này:for person in var_name: print(person['eng_name'] + " " + person['rank'])
theQuestionMan

3

Câu trả lời của Oskar Persson là cách tốt nhất để xử lý nó vì giúp dễ dàng truyền dữ liệu vào ngữ cảnh và xử lý nó một cách bình thường từ mẫu khi chúng ta lấy các thể hiện đối tượng (có thể dễ dàng lặp lại để lấy đạo cụ) thay vì danh sách giá trị đơn giản.

Sau đó, bạn có thể dễ dàng có được chỗ dựa mong muốn:

for employee in employees:
    print(employee.eng_name)

Hoặc trong mẫu:

{% for employee in employees %}

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

{% endfor %}

1

Bạn có thể sử dụng danh sách giá trị cùng với bộ lọc như vậy;

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

Thêm chi tiết tại đây

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.