modelli django selezionando singolo campo


102

Ho una tabella / modelli chiamati Employeese vorrei ottenere tutte le righe di un singolo campo come set di query.

So di poterlo fare in questo modo (spero di farlo anche bene):

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

Interrogherebbe il database per tutti i campi e usarne uno solo? C'è un modo migliore (più veloce) per farlo?


Cosa intendi con "e usandone solo uno"? A SELECT colinvece di SELECT *?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Risposte:


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

Ciò crea un elenco semplice di tutti eng_namei messaggi. Se vuoi più di un campo per riga, non puoi fare un elenco semplice: questo creerà un elenco di tuple:

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

grazie per la risposta, e se volessi selezionare solo 1 o più campi (non tutti)?
zentenk

Scusa, non capisco la domanda.
Daniel Roseman

3
per favore condividi il documento. che aiuterà gli altri
bob marti

25

Oltre a values_listquanto menzionato da Daniel , puoi anche usare (o per l'effetto opposto) per ottenere un set di query di oggetti con solo il loro ID e campi specificati:onlydefer

Employees.objects.only('eng_name')

Questo eseguirà una singola query:

SELECT id, eng_name FROM employees

3
Questo comando mi restituisce tutti i campi per la mia versione 2.1.3 di Django e la versione 3.6.2 di python.
Ananthi

Recupererà solo questo file, ma se provi ad accedere ad altri campi, verrà eseguita una query di database separata. Quindi questa è una buona tecnica di ottimizzazione, ma assicurati di non creare queste query aggiuntive. Altrimenti perderai le prestazioni invece di ottenerle.
Eerik Sven Puudist il

6

Possiamo selezionare i campi obbligatori sopra i valori.

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

Dopo che la query è stata eseguita correttamente, come memorizzare il valore di un campo in una variabile, ad es. var_name = <query_name>. <field_name> ?
user12379095

@ user12379095 semplicemente così:var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan

@ user12379095 e quindi per utilizzare questo nome_var - ad esempio: stampa tutti i nomi e il grado dei dipendenti, puoi farlo:for person in var_name: print(person['eng_name'] + " " + person['rank'])
theQuestionMan

3

La risposta di Oskar Persson è il modo migliore per gestirla perché rende più facile passare i dati al contesto e trattarli normalmente dal modello quando otteniamo le istanze dell'oggetto (facilmente iterabili per ottenere oggetti di scena) invece di un semplice elenco di valori.

Dopodiché puoi ottenere facilmente il sostegno desiderato:

for employee in employees:
    print(employee.eng_name)

O nel modello:

{% for employee in employees %}

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

{% endfor %}

1

Puoi usare values_list insieme al filtro in questo modo;

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

Maggiori dettagli qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.