web-dev-qa-db-fra.com

django modèles sélectionnant un seul champ

J'ai une table/des modèles appelés Employees et je voudrais obtenir toutes les lignes d'un seul champ comme un ensemble de requêtes.

Je sais que je peux le faire comme ça (j'espère que je fais ça bien même):

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

Souhaitez-vous interroger la base de données pour tous les champs et en utiliser un seul? Existe-t-il une meilleure façon (plus rapide) de procéder?

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

Cela crée une liste plate de tous les eng_names. Si vous voulez plus d'un champ par ligne, vous ne pouvez pas faire une liste plate: cela créera une liste de tuples:

Employees.objects.values_list('eng_name', 'rank')
120
Daniel Roseman

En plus de values_list as Danielmentionne vous pouvez également utiliser only (ou defer = pour l'effet inverse) pour obtenir un ensemble de requêtes d'objets ayant uniquement leur identifiant et des champs spécifiés:

Employees.objects.only('eng_name')

Cela exécutera une seule requête:

SELECT id, eng_name FROM employees
17
Oskar Persson

La réponse d'Oskar Persson est le meilleur moyen de le gérer car il facilite le passage des données au contexte et le traite normalement à partir du modèle lorsque nous obtenons les instances d'objet (facilement itérable pour obtenir des accessoires) au lieu d'une simple liste de valeurs.

Après cela, vous pouvez facilement obtenir l'hélice souhaitée:

for employee in employees:
    print(employee.eng_name)

Ou dans le modèle:

{% for employee in employees %}

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

{% endfor %}
1
PeteMaikel

Nous pouvons sélectionner les champs obligatoires sur les valeurs.

Employee.objects.all().values('eng_name','rank')
1
Alok Choudhary