values ()
dans Django ORMDjango ORM a des méthodes similaires, <Model> .objects.values ()
et <Model> .objects.only ()
, values ()
et ʻonly () `, mais un peu J'y étais accro, donc comme mémorandum.
L'origine de ceci est que lorsque j'ai écrit un code comme ↓, j'ai eu l'erreur suivante.
president1 = Company.objects.values(*fields)[0].president
# =>Erreur: AttributeError: 'dict' object has no attribute 'president'
Ici, à partir du modèle Company
, en utilisant la méthode values ()
de Django ORM,
J'essaie d'obtenir la valeur du champ president
du premier élément d'un ensemble de requêtes (comme une liste Python avec un type de données itérable qui contient plusieurs objets) généré en extrayant uniquement un champ spécifique ..
Cependant, au moment de l'exécution, j'ai eu l'erreur ʻAttribute Error: l'objet 'dict' n'a pas d'attribut'president'`.
Même après avoir examiné la définition du modèle, j'ai découvert que le champ «président» existe, mais c'est étrange. différence entre values () et only () a été utile.
values ()
renvoie ValuesQuerySet
au lieu de QuerySet
Selon l'article de référence, la méthode values ()
retourne un objet du type de données ValuesQuerySet
.
Basé sur QuerySet
, il renverra ** quelque chose comme un tableau d'éléments convertis à partir de champs d'objet dans un dictionnaire (= ValuesQuerySet) **.
En d'autres termes, dans le code ci-dessus, j'essayais de récupérer les données de champ du dictionnaire {'president': 'xxx', ...}
en utilisant .president
, donc j'ai eu une erreur.
Puisqu'il s'agit d'un dictionnaire, utiliser ['president']
signifie qu'aucune erreur ne s'est produite.
Lorsque vous lisez le message d'erreur, il dit `` 'dict' object`. ..
renvoie
QuerySet`Donc, si vous voulez Query Set
comme ce cas, vous pouvez utiliser ʻonly ()` [^ 1]. Cette fois, l'élément n'est pas un dictionnaire, mais une instance de la classe est renvoyée correctement, donc aucune erreur ne se produit.
Au fait, «QuerySet» est itérable, mais attention car le type de données est différent de «list» (parce qu'il est similaire, je suis parfois accro).
Lors de la conversion d'un ensemble de requêtes en liste, il peut être converti avec ** list (objet QuerySet)
**.
[^ 1]: seuls les champs spécifiés peuvent être extraits. Utilisé pour le réglage des performances. Inversement, vous pouvez utiliser defer ()
pour exclure le champ spécifié.
Recommended Posts