tek alan seçen django modelleri


102

EmployeesAdında bir tablom / modeller var ve tek bir alanın tüm satırlarını bir sorgu kümesi olarak almak istiyorum.

Bunu böyle yapabileceğimi biliyorum (umarım bunu doğru yapıyorum bile):

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

Veritabanını tüm alanlar için ve yalnızca birini mi kullanarak sorgulayacak? Bunu yapmanın daha iyi (daha hızlı) bir yolu var mı?


"Ve sadece bir tane kullanmak" ile ne demek istiyorsun? A SELECT colyerine SELECT *?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Yanıtlar:


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

Bu, tüm eng_namee- postaların düz bir listesini oluşturur . Satır başına birden fazla alan istiyorsanız, düz bir liste yapamazsınız: bu bir tuple listesi oluşturacaktır:

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

cevap için teşekkürler, ya sadece 1 veya daha fazla alan seçmek istersem (tümü değil)?
zentenk

Maalesef soruyu anlamadım.
Daniel Roseman

4
lütfen belgeyi paylaşın. başkalarına yardımcı olacak
bob marti

25

Ek olarak values_listolarak Daniel bahseder de kullanabilirsiniz only(veya defertersi etki için) sadece kendi kimliğini ve belirtilen alanları olan nesnelerin Sorgu Kümesi almak için:

Employees.objects.only('eng_name')

Bu, tek bir sorgu çalıştıracaktır:

SELECT id, eng_name FROM employees

3
Bu komut bana Django sürüm 2.1.3 ve python sürüm 3.6.2 için tüm alanları döndürüyor.
Ananthi

Yalnızca bu dosyalanmış olanı getirecek, ancak diğer alanlara erişmeye çalışırsanız, ayrı bir veritabanı sorgusu yürütülecektir. Dolayısıyla bu iyi bir optimizasyon tekniğidir, ancak bu fazladan sorguları oluşturmadığınızdan emin olun. Aksi takdirde, kazanmak yerine performansınızı kaybedersiniz.
Eerik Sven Puudist

6

Değerler yerine gerekli alanları seçebiliriz.

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

Sorgu başarıyla çalıştırıldıktan sonra, bir değişkendeki bir alanın değeri nasıl saklanır, ör. var_name = <query_name>. <field_name> ?
user12379095

@ user12379095 aynen şöyle:var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan

@ user12379095 ve sonra bu var_name'yi kullanmak için - örneğin: tüm çalışanların adlarını ve rütbelerini yazdırın, bunu yapabilirsiniz:for person in var_name: print(person['eng_name'] + " " + person['rank'])
theQuestionMan

3

Oskar Persson'ın cevabı, bunun üstesinden gelmenin en iyi yoludur çünkü verileri içeriğe aktarmayı ve düz bir değer listesi yerine nesne örneklerini (sahne almak için kolayca yinelenebilir) elde ettiğimiz için normal olarak şablondan işlemeyi kolaylaştırır.

Bundan sonra istediğiniz pervaneyi kolayca alabilirsiniz:

for employee in employees:
    print(employee.eng_name)

Veya şablonda:

{% for employee in employees %}

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

{% endfor %}

1

Bu şekilde filtrenin yanında values_list kullanabilirsiniz;

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

Daha fazla ayrıntı burada

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.