Django-Modelle, die ein einzelnes Feld auswählen

95

Ich habe eine Tabelle / Modelle mit dem Namen Employeesund möchte alle Zeilen eines einzelnen Felds als Abfragesatz erhalten.

Ich weiß, dass ich es so machen kann (hoffe, ich mache das sogar richtig):

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

Würde die Datenbank nach allen Feldern abfragen und nur eines verwenden? Gibt es einen besseren (schnelleren) Weg, dies zu tun?

zentenk
quelle
Was meinst du mit "und nur einer verwenden"? A SELECT colstatt SELECT *?
Ciro Santilli 法轮功 冠状 病 六四.

Antworten:

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

Dadurch wird eine flache Liste aller eng_names erstellt. Wenn Sie mehr als ein Feld pro Zeile möchten, können Sie keine flache Liste erstellen. Dadurch wird eine Liste mit Tupeln erstellt:

Employees.objects.values_list('eng_name', 'rank')
Daniel Roseman
quelle
Vielen Dank für die Antwort. Was ist, wenn ich nur ein oder mehrere Felder (nicht alle) auswählen möchte?
Zentenk
Entschuldigung, ich verstehe die Frage nicht.
Daniel Roseman
3
Bitte teilen Sie das Dokument. Das wird anderen helfen
Bob Marti
22

Neben values_listals Daniel erwähnt Sie auch verwenden können only(oder deferfür die entgegengesetzte Wirkung) nur eine queryset von Objekten zu erhalten ihre ID und angegebenen Felder mit:

Employees.objects.only('eng_name')

Dadurch wird eine einzelne Abfrage ausgeführt:

SELECT id, eng_name FROM employees
Oskar Persson
quelle
3
Dieser Befehl gibt mir alle Felder für meine Django-Version 2.1.3 und Python-Version 3.6.2 zurück.
Ananthi
Es wird nur diese Datei abgerufen, aber wenn Sie versuchen, auf andere Felder zuzugreifen, wird eine separate Datenbankabfrage ausgeführt. Dies ist also eine gute Optimierungstechnik, aber stellen Sie sicher, dass Sie diese zusätzlichen Abfragen nicht erstellen. Andernfalls verlieren Sie die Leistung, anstatt sie zu gewinnen.
Eerik Sven Puudist
5

Wir können erforderliche Felder über Werten auswählen.

Employee.objects.all().values('eng_name','rank')
Alok Choudhary
quelle
Nachdem die Abfrage erfolgreich ausgeführt wurde, wie der Wert eines Feldes in einer Variablen gespeichert wird, z. var_name = <Abfragename>. <Feldname> ?
user12379095
3

Die Antwort von Oskar Persson ist der beste Weg, um damit umzugehen, da es einfacher ist, die Daten an den Kontext zu übergeben und sie normal aus der Vorlage zu behandeln, wenn wir die Objektinstanzen (leicht iterierbar, um Requisiten zu erhalten) anstelle einer einfachen Werteliste erhalten.

Danach können Sie ganz einfach die gewünschte Requisite bekommen:

for employee in employees:
    print(employee.eng_name)

Oder in der Vorlage:

{% for employee in employees %}

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

{% endfor %}
PeteMaikel
quelle
1

Sie können values_list neben dem Filter wie folgt verwenden.

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

Weitere Details hier

7guyo
quelle