2008-11-03 9 views

Odpowiedz

4

Myślę, że możesz sprawdzić słownik atrybutów dziecka, aby sprawdzić, czy dane już tam są.

+0

To działa, dzięki :) – Joril

3

Lekko neater niż Haes odpowiedź (choć skutecznie robi to samo) jest użycie hasattr(), na przykład:

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

Nice, thanks :) – Joril

+2

To nie działa aktualna sqlalchemy. 'hasattr (obj, field)' nie jest równoważne 'polu w obj .__ dict__'. –

+0

Testowałem w SQLAlchemy 0.8 i to działa, jeśli obiekt jest odłączony. Jednak jeśli jest podłączony, użycie hasattr wyzwala leniwy ładunek "dzieci", co prawdopodobnie nie jest tym, czego potrzebujesz. Zamiast tego w 0.8 możemy użyć wywołania inspect(): 'res = inspect (X)' ''children' in res.unloaded' - który działa niezależnie od tego, czy obiekt jest dołączony czy odłączony. – foz

10

Można uzyskać listę wszystkich rozładowywane właściwości (zarówno stosunki i kolumny) od sqlalchemy.orm.attributes.instance_state(obj).unloaded.

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

Łatwiejszy sposobem jest użycie inspect(), co daje te same wyniki:

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 
Powiązane problemy