2008-11-03 6 views

Répondre

4

Je pense que vous pouvez regarder le dictionnaire __dict__ d'attribut de l'enfant pour vérifier si les données sont déjà là ou non.

+0

Il fonctionne, thanks – Joril

3

légèrement plus propre que Haes réponse (si elle fait effectivement la même chose) est d'utiliser hasattr(), comme dans:

>>> hasattr(X, 'children') 
False 
+0

Nice, merci :) – Joril

+2

Cela ne fonctionne pas avec sqlalchemy actuel. 'hasattr (obj, field)' n'est pas équivalent à 'field dans obj .__ dict__'. –

+0

J'ai testé dans SQLAlchemy 0.8 et cela fonctionne si l'objet est détaché. Cependant, si elle est attachée, l'utilisation de hasattr déclenche la charge paresseuse des 'enfants', ce qui n'est probablement pas ce que vous voulez. Au lieu de 0.8, nous pouvons utiliser l'appel inspect(): res = inspect (X) '' 'children' dans res.unloaded' - qui fonctionne si l'objet est attaché ou détaché. – foz

10

Vous pouvez obtenir une liste de toutes les propriétés débarquées (les relations et colonnes) à partir de sqlalchemy.orm.attributes.instance_state(obj).unloaded.

Voir: Completing object with its relations and avoiding unnecessary queries in sqlalchemy

Un moyen plus facile est d'utiliser inspect(), qui donne les mêmes résultats:

from sqlalchemy import inspect 
from sqlalchemy.orm import lazyload 

user = session.query(User).options(lazyload(User.articles)).first() 
ins = inspect(user) 

ins.unloaded # <- set or properties that are not yet loaded 
Questions connexes