Как отфильтровать запрос по столбцам, только если выполнено другое условие

#python #sql #sqlalchemy

Вопрос:

У меня есть вопрос:

 query = Usage.query.filter_by(site_id=self.site_id, invoice_num=self.invoice_num, supply_charge=self.supply_charge)
 

И хотите отфильтровать по датам:

 .filter(Usage.start_date>four_months_ago)
 

только в том случае, если фильтруемая строка имеет одно и то же значение:

 if subtotal == self.subtotal
 

Есть ли лучший способ сделать это, чем сделать цикл for? Это кажется очень неэффективным.

 for row in query.all():
    if self.start_date > four_months_ago:
        if row.subtotal != self.subtotal:
            del row
 

Ответ №1:

Состояние

 (subtotal == self.subtotal) amp; (Usage.start_date > four_months_ago)
 

выглядит как

 WHERE start_date > 'val1' AND subtotal = val2
 

в противном случае, OR subtotal != val2 . Вы можете попробовать использовать or_ and_ . Просто пример:

 subtotal = 1
for user in Usage.query.filter(
    Usage.site_id == 2,
    Usage.invoice_num == 3,
    Usage.supply_charge == 4,
    or_(
        and_(Usage.start_date > for_month_ago, Usage.subtotal == subtotal),
        Usage.subtotal != subtotal,
    )
):
    print(user)