Saya memiliki model Employees
dan 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?
python
django
django-models
zentenk
sumber
sumber
SELECT col
bukannyaSELECT *
?Jawaban:
Employees.objects.values_list('eng_name', flat=True)
Itu menciptakan daftar datar semua
eng_name
s. 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')
sumber
Selain
values_list
seperti yang disebutkan Daniel, Anda juga dapat menggunakan (atau untuk efek sebaliknya) untuk mendapatkan queryset objek yang hanya memiliki id dan kolom tertentu:only
defer
Employees.objects.only('eng_name')
Ini akan menjalankan satu kueri:
SELECT id, eng_name FROM employees
sumber
Kita dapat memilih bidang yang diperlukan di atas nilai.
Employee.objects.all().values('eng_name','rank')
sumber
var_name = Employee.objects.all().values('eng_name','rank')
for person in var_name: print(person['eng_name'] + " " + person['rank'])
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 %}
sumber
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
sumber
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)
sumber