Как запросить базу данных для поддержки ограничения частоты - PullRequest
0 голосов
/ 28 мая 2019

Я хотел бы получить все объявления, чей 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))

Это оправдывает все посещения, сделанные одним посетителем безпроверка частоты ограничения.Как я могу начать с этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...