2012-02-05 9 views
9

nel caso in cui io abbia un modello di utente e un modello di articolo, l'utente e l'articolo sono una relazione uno-a-molti. così posso accedere articolo come questocome limitare/compensare il risultato della relazione sqlalchemy orm?

user = session.query(User).filter(id=1).one() 
print user.articles 

ma questo sarà un elenco di tutti gli articoli dell'utente, che cosa se voglio limitare articoli a 10? in rotaie c'è un metodo all() che può avere limiti/offset in esso. in sqlalchemy esiste anche un metodo all(), ma non prendi parametri, come ottenere questo?

Edit:

sembra user.articles[10:20] è valido, ma l'SQL non ha utilizzato 10/20 nelle query. quindi in effetti caricherà tutti i dati corrispondenti e filtrerà in python?

risposta

11

La soluzione è utilizzare una relazione dynamic come descritto nella sezione collection configuration techniques della documentazione SQLAlchemy.

Specificando il rapporto come

class User(...): 
    # ... 
    articles = relationship('Articles', order_by='desc(Articles.date)', lazy='dynamic') 

si può quindi scrivere user.articles.limit(10) che genererà ed eseguire una query per recuperare gli ultimi dieci articoli da parte dell'utente. Oppure puoi usare la sintassi [x:y] se preferisci che genererà automaticamente una clausola LIMIT.

Le prestazioni devono essere ragionevoli a meno che non si desideri interrogare gli ultimi dieci articoli per 100 o più utenti (nel qual caso verranno inviate al server almeno 101 query).

Problemi correlati