132 votes

Comment obtenir un QuerySet de toutes les lignes, avec des champs spécifiques pour chacune d'entre elles ?

J'ai un modèle Employees et je voudrais avoir un QuerySet de toutes les lignes, mais avec certains champs spécifiques de chaque ligne, et pas tous les champs.

Je sais comment interroger toutes les lignes de la table/modèle :

Employees.objects.all()

Je voudrais savoir comment sélectionner des champs pour chacun des éléments de Queryset. Comment puis-je le faire ?

0 votes

Que voulez-vous dire par "et n'en utiliser qu'un seul" ? A SELECT col au lieu de SELECT * ?

236voto

Daniel Roseman Points 199743
Employees.objects.values_list('eng_name', flat=True)

Cela crée une liste plate de tous les eng_name s. 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')

0 votes

Merci pour la réponse, que faire si je veux sélectionner seulement 1 ou plusieurs champs (pas tous) ?

0 votes

Désolé, je ne comprends pas la question.

4 votes

S'il vous plaît, partagez le document. cela aidera les autres.

38voto

Oskar Points 982

En plus de values_list como Daniel mentionne vous pouvez également utiliser only (ou defer pour l'effet inverse) pour obtenir un queryset d'objets ayant seulement leur id et les champs spécifiés :

Employees.objects.only('eng_name')

Ceci va exécuter une seule requête :

SELECT id, eng_name FROM employees

5 votes

Cette commande me renvoie tous les champs pour ma version de Django 2.1.3 et ma version de python 3.6.2.

3 votes

Il ne récupérera que ce seul champ, mais si vous essayez d'accéder à d'autres champs, une requête de base de données distincte sera exécutée. Il s'agit donc d'une bonne technique d'optimisation, mais veillez à ne pas créer ces requêtes supplémentaires. Sinon, vous perdrez des performances au lieu d'en gagner.

0 votes

La différence entre only et values est que only récupère également l'identifiant.

12voto

Alok Choudhary Points 145

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

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

0 votes

Une fois la requête exécutée avec succès, comment stocker la valeur d'un champ dans une variable, par ex. var_name = <nom_de_la_requête>.<nom_du_champ> ?

0 votes

@user12379095 tout simplement comme ça : var_name = Employee.objects.all().values('eng_name','rank')

0 votes

@user12379095 et ensuite pour utiliser cette var_name - par exemple : imprimer tous les noms et rangs des employés, vous pouvez faire ceci : for person in var_name: print(person['eng_name'] + " " + person['rank'])

3voto

Sumit Vaise Points 58

Daniel La réponse est juste à côté. Si vous souhaitez interroger plus d'un champ, procédez comme suit :

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

Ceci retournera une liste de tuples. Vous ne pouvez pas utiliser named=Ture lorsque vous interrogez plus d'un champ.

De plus, si vous savez qu'il n'existe qu'un seul champ avec cette information et que vous connaissez l'identifiant du pk, faites-le :

Employee.objects.values_list('eng_name','rank').get(pk=1)

3voto

PeteMaikel Points 59

La réponse d'Oskar Persson est la meilleure façon de gérer ce problème, car elle facilite le passage des données à l'outil de gestion des données. contexte et le traiter normalement à partir du modèle car nous obtenons les instances de l'objet (facilement itérable pour obtenir les props) au lieu d'une simple liste de valeurs.

Après cela, vous pouvez facilement obtenir l'accessoire souhaité :

for employee in employees:
    print(employee.eng_name)

Ou dans le modèle :

{% for employee in employees %}

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

{% endfor %}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X