#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)