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?


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')

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

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')

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 %}

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


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.