1. Sélection d'éléments simples
On dirait que vous essayez d'obtenir un seul objet. L'utilisation de filter
renverra un objet QuerySet
(comme c'est le cas dans votre code), qui se comporte plus comme une liste (et, comme vous l'avez remarqué, n'a pas l'attribut name
).
Vous avez deux options ici. Tout d'abord, vous pouvez simplement saisir le premier élément:
info_l = info.objects.filter(id=1)[0]
Vous pouvez également utiliser la méthode objects.get
à la place, qui retournera un seul objet (et lever une exception si elle n'existe pas):
info_l = info.objects.get(id=1)
Django a une très bonne documentation sur QuerySets, et il peut être utile de jeter un coup d'oeil:
Docs on using filters
QuerySet
reference
2. Les champs spécifiques Récupération
Django fournit les méthodes et defer
only
, qui vous permettra de choisir des domaines spécifiques de la base de données, plutôt que de chercher de tout à la fois. Ceux-ci n'empêchent pas réellement les champs d'être lus; plutôt, il les charge paresseusement. defer
est un mode «opt-in», qui vous permet de spécifier quels champs doivent être chargés paresseusement. only
est "out-out" - vous l'appelez, et seulement les champs que vous passez seront chargés avec impatience.
Donc, dans votre exemple, vous voulez faire quelque chose comme ceci:
info_l = info.objects.filter(id=1).only('name')[0]
Bien qu'avec un modèle aussi simple que l'exemple que vous donnez, je ne voudrais pas vous inquiéter beaucoup du tout sur la limitation des champs.
Merci pour la réponse. Ce que je voulais dire est par exemple: sélectionnez le nom de info; au lieu de faire un select * à partir de info; Merci pour la réponse – Hulk
Ah, je comprends maintenant. J'ai mis à jour la réponse. – ShZ
+1 pour réfléchie, réponse complète pointant vers les docs. Nous avons besoin de plus de réponses comme celles-ci. :-) – cethegeek