Bagaimana cara mendapatkan QuerySet dari semua baris, dengan kolom spesifik untuk masing-masing baris?

109

Saya memiliki model Employeesdan saya ingin memiliki QuerySet dari semua baris, tetapi dengan beberapa bidang tertentu dari setiap baris, dan tidak semua bidang.

Saya tahu cara menanyakan semua baris dari tabel / model:

Employees.objects.all()

Saya ingin tahu bagaimana memilih field untuk setiap elemen Queryset. Bagaimana saya bisa melakukan itu?

zentenk
sumber
Apa yang Anda maksud dengan "dan hanya menggunakan satu"? A SELECT colbukannya SELECT *?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

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

Itu menciptakan daftar datar semua eng_names. Jika Anda menginginkan lebih dari satu bidang per baris, Anda tidak dapat membuat daftar datar: ini akan membuat daftar tupel:

Employees.objects.values_list('eng_name', 'rank')
Daniel Roseman
sumber
terima kasih atas jawabannya, bagaimana jika saya hanya ingin memilih 1 bidang atau lebih (tidak semua)?
zentenk
Maaf, saya tidak mengerti pertanyaannya.
Daniel Roseman
4
tolong bagikan dokumen. itu akan membantu orang lain
bob marti
26

Selain values_listseperti yang disebutkan Daniel, Anda juga dapat menggunakan (atau untuk efek sebaliknya) untuk mendapatkan queryset objek yang hanya memiliki id dan kolom tertentu:onlydefer

Employees.objects.only('eng_name')

Ini akan menjalankan satu kueri:

SELECT id, eng_name FROM employees
Oskar Persson
sumber
3
Perintah ini mengembalikan saya semua bidang untuk Django versi 2.1.3 dan python versi 3.6.2.
Ananthi
Ini hanya akan mengambil yang satu ini, tetapi jika Anda mencoba mengakses bidang lain, kueri basis data terpisah akan dijalankan. Jadi ini adalah teknik pengoptimalan yang baik, tetapi pastikan Anda tidak membuat kueri tambahan ini. Jika tidak, Anda akan kehilangan kinerja alih-alih mendapatkannya.
Eerik Sven Puudist
6

Kita dapat memilih bidang yang diperlukan di atas nilai.

Employee.objects.all().values('eng_name','rank')
Alok Choudhary
sumber
Setelah kueri berhasil dijalankan, cara menyimpan nilai bidang dalam variabel, misalnya. var_name = <query_name>. <field_name> ?
pengguna12379095
@ user12379095 hanya seperti ini:var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan
@ user12379095 dan kemudian untuk menggunakan var_name ini - misalnya: mencetak semua nama dan pangkat karyawan, Anda dapat melakukan ini:for person in var_name: print(person['eng_name'] + " " + person['rank'])
theQuestionMan
3

Jawaban Oskar Persson adalah cara terbaik untuk menanganinya karena membuatnya lebih mudah untuk meneruskan data ke konteks dan memperlakukannya secara normal dari template saat kita mendapatkan instance objek (mudah diulang untuk mendapatkan props) daripada daftar nilai biasa.

Setelah itu Anda bisa dengan mudah mendapatkan prop yang diinginkan:

for employee in employees:
    print(employee.eng_name)

Atau di template:

{% for employee in employees %}

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

{% endfor %}
PeteMaikel
sumber
2

Anda dapat menggunakan values_list bersama filter seperti itu;

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

Lebih lengkapnya di sini

7guyo
sumber
0

Jawaban Daniel tepat di tempat. Jika Anda ingin menanyakan lebih dari satu bidang, lakukan ini:

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

Ini akan mengembalikan daftar tupel. Anda tidak dapat menggunakan bernama = Ture saat melakukan kueri lebih dari satu bidang.

Terlebih lagi jika Anda tahu bahwa hanya ada satu bidang dengan info itu dan Anda tahu id pk, lakukan ini:

Employee.objects.values_list('eng_name','rank').get(pk=1)
Sumit Vaise
sumber