Динамическое свойство column_property с SQLAlchemy - PullRequest
4 голосов
/ 26 марта 2011

У меня есть несколько моделей SA, и мне нужен какой-то трюк:

class Entry(Base):
    __tablename__ = 'entry'
    id = Column(Integer, primary_key=True)
    title = Column(Unicode(255))
    author_id = Column(Integer, ForeignKey('user.id'))
    date = Column(DateTime)
    content = Column(Text)
    author = relationship('User', backref='entries')

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    username = Column(Unicode(255))
    ...

Как вы можете видеть, это очень классически, пользователи пишут записи ... Мне нужно представить некоторую статистику о них (например, showих записи в неделю / месяц ...)

Для подсчета записей я добавил column_property к модели пользователя, например, так:

class User(Base):
    ...
    entries_count = column_property(select([func.count(Entry.id)]).\
                                            where(Entry.author_id==id))

Это позволило мне показать, какМногие записи были написаны пользователями.Но чтобы получить некоторую статистику с учетом диапазона дат, мне нужно будет динамически адаптировать records_count для добавления критериев дат.

Итак, вопрос в том, как бы вы справились с управлением критериями дат.??Является ли column_property лучшим решением для такого рода нужд?

Спасибо заранее.

1 Ответ

7 голосов
/ 28 марта 2011

Добавление свойства - это хороший способ получить состояние базы данных, связанное с объектом. Но с параметром внешнего критерия счетчик будет не просто состоянием, а функцией. Представление таких данных как свойства объекта не будет хорошим. Поэтому запросите дополнительные данные напрямую (считая antries новее, чем start_date во всех примерах ниже):

session.query(User, func.count(Entry.id))\
    .outerjoin((Entry, (Entry.author_id==User.id) & (Entry.date>start_date)))\
    .group_by(User.id)

Или определите вспомогательный метод (не свойство!) В классе User, чтобы упростить использование:

class User(Base):
    # ...
    @classmethod
    def entries_count(cls, cond):
        return select([func.count(Entry.id)])\
                .where((Entry.author_id==cls.id) & cond)\
                .as_scalar()

session.query(User, User.entries_count(Entry.date>start_date))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...