Я хотел бы получить все объявления, чей FrequencyCap.ad_limit не был превышен.Хитрость заключается в том, что каждая строка ограничения частоты может определять разные периоды (последний день, последний месяц, прошлый год).
Ограничение частоты - это ограничение количества показов объявления в течение определенного промежутка времени.
Мои модели выглядят так:
class Visit(Model):
__tablename__ = 'visits'
id = Column(Integer, primary_key=True)
visitor_id = Column(UUID, ForeignKey('visitors.id'))
ad_id = Column(Integer, ForeignKey('ads.id'))
class Visitor():
__tablename__ = 'visitors'
id = Column(Integer, primary_key=True)
visit = relationship('Visit', backref='visitor')
class Ad():
__tablename__ = 'ads'
id = Column(Integer, primary_key=True)
visit = relationship('Visit', backref='ad')
frequency_cap = relationship('FrequencyCap', uselist=False, backref='ad')
class FrequencyCap():
__tablename__ = 'frequency_cap'
id = Column(Integer, primary_key=True)
limit_ad = Column(Integer)
# period can takes values 0 (day), 1 (week), 2 (month)
period = Column(ChoiceType(PeriodType, impl=Integer()), nullable=False)
ad_id = Column(Integer, ForeignKey('ads.id', ondelete='CASCADE'))
До сих пор я придумал что-то вроде этого:
visits = session.query(
func.count(Visit.id).label('number')).filter(
Visit.visitor == 1).filter(
Visit.type == 0).join(
Ad, Ad.id == Visit.ad_id).join(
FrequencyCap, FrequencyCap.ad_id == Ad.id).subquery()
ads_query = session.query(Ad).filter(
Ad.frequency_cap.has(FrequencyCap.limit_ad < visits.c.number))
Это оправдывает все посещения, сделанные одним посетителем безпроверка частоты ограничения.Как я могу начать с этого?