2015-12-24 27 views
5

sto usando un quadro che fa impaginazione come questo:SQLAlchemy func.count con filtro

def get_count_query(self): 
    return self.session.query(func.count('*')).select_from(self.model) 

def paginate(self): 
    ... <irrelevant>... 
    count = self.get_count_query.scalar() 
    ... 

voglio l'override del metodo get_count_query usare la mia domanda perché sto filtrando alcuni risultati e get_count_query solo restituisce tutti gli elementi nella tabella. Le query vengono create dinamicamente, ad esempio una query potrebbe essere:

Asset.query.join(StatusLabel).filter(StatusLabel.status == 'Deployable', or_(
            Asset.assigned_to.isnot(None)), 
            Asset.deleted_at.is_(None)) 

posso contare gli elementi in questa query facilmente con query.count():

def get_count_query(self): 
    q = Asset.query.join(StatusLabel).filter(StatusLabel.status == 'Deployable', or_(
              Asset.assigned_to.isnot(None)), 
              Asset.deleted_at.is_(None)) 
    return q.count() 

Ma questo non riuscirà una volta che raggiunge la .scalar() metodo (e non riesco a rimuovere questo metodo). Quindi la domanda è: come posso applicare func.count('*') a una query esistente?

Posso recuperare i filtri dalla mia query e applicarli alla query func.count('*')?

risposta

2

è possibile utilizzare select_from con join e filter

def get_count_query(self): 
    return self.session.query(func.count('*')).select_from(Asset).join(StatusLabel)\ 
               .filter(StatusLabel.status == 'Deployable', or_(
                 Asset.assigned_to.isnot(None), 
                 Asset.deleted_at.is_(None))) 

con subquery

def get_count_query(self): 
    q = Asset.query.join(StatusLabel).filter(StatusLabel.status == 'Deployable', or_(
              Asset.assigned_to.isnot(None)), 
              Asset.deleted_at.is_(None)) 

    return self.session.query(func.count('*')).select_from(q.subquery()) 
+0

Grazie per la risposta, ma questo non funzionerà per me. La query è costruita dinamicamente, non è sempre la stessa. Le sottoquelle – fasouto

+0

possono aiutare. Ho aggiornato la mia risposta –

+0

Grazie mille! Sono stato bloccato da questo semplice problema per ore! :) – fasouto

Problemi correlati