[PYTHON] [Django ORM] Différence entre values () et only ()

L'histoire qui s'est coincée dans l'erreur de values () dans Django ORM

Django 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.

version

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`. ..

ʻOnly () 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

[Django ORM] Différence entre values () et only ()
Différence entre "categorical_crossentropy" et "sparse_categorical_crossentropy"
Différence entre régression et classification
Différence entre np.array et np.arange
Différence entre MicroPython et CPython
Différence entre ps a et ps -a
Différence entre return et print-Python
Différence entre java et python (mémo)
Différence entre list () et [] en Python
Différence entre SQLAlchemy filter () et filter_by ()
Différence entre == et est en python
Mémorandum (différence entre csv.reader et csv.dictreader)
(Remarque) Différence entre la passerelle et la passerelle par défaut
Différence entre le randint de Numpy et le randint de Random
Différence entre tri et tri (mémorial)
Différence entre la série python2 et la série python3 dict.keys ()
[Python] Différence entre fonction et méthode
Différence entre SQLAlchemy flush () et commit ()
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
[Xg boost] Différence entre softmax et softprob
différence entre les instructions (instructions) et les expressions (expressions) en Python
Différences dans la relation entre PHP et Python enfin et quitter
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
[Python] Différence entre la méthode de classe et la méthode statique
Différence entre le fichier env_file docker-compose et le fichier .env
[Python Iroha] Différence entre List et Tuple
[python] Différence entre la sortie rand et randn
Différence de vitesse entre wsgi, bouteille et flacon
Différence entre numpy.ndarray et list (dimension, taille)
Différence entre ls -l et la commande cat
Vérification de la différence et de la compatibilité entre keras et tf.keras # 1
Différence entre l'utilisation et l'importation sur le langage de bouclier
[python] Différence entre variable et self. Variable dans la classe
À propos de la différence entre "==" et "is" en python
À propos de la différence entre PostgreSQL su et sudo
Quelle est la différence entre Unix et Linux?
Prise en compte de la différence entre la courbe ROC et la courbe PR
Différence approximative entre Unicode et UTF-8 (et ses compagnons)
BERT peut-il comprendre la différence entre «Ame (bonbons)» et «Ame (pluie)»?
Différence entre Ruby et Python en termes de variables
Quelle est la différence entre usleep, nanosleep et clock_nanosleep?
Différence entre la notation Numpy (n,) et (n, 1) [Différence entre le vecteur horizontal et le vecteur vertical]
Différence entre return, return None et no return description en Python
Comment utiliser argparse et la différence entre optparse
Différence centrale et différence avant
Entre paramétrique et non paramétrique
Quelle est la différence entre les liens symboliques et les liens durs?
Module Python num2words Différence de comportement entre l'anglais et le russe
Comprendre la différence entre l'affectation cumulative aux variables et l'affectation cumulative aux objets
Méthode de concaténation de liste en python, différence entre list.extend () et opérateur «+»
Différence entre les back_populates et backref de SQL Alchemy et lorsque ni l'un ni l'autre n'est utilisé
Différence entre le processus de premier plan et le processus d'arrière-plan compris par principe
Relation entre Bound / Unbound et la valeur initiale du formulaire Django2
Résumé des différences entre Ruby on rails et Django ~ Bases ~