python – 带有SQLAlchemy的动态column_property

我有一些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))
    ...

正如您所看到的,这是非常经典的,用户写条目……
我需要渲染一些关于它们的统计数据(比如每周/每月显示它们的条目……)

对于计数条目,我将column_property添加到用户模型,如下所示:

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

这让我可以看到用户已经写了多少条目.
但是为了给出一些日期范围的统计数据,我需要动态调整entries_count以添加日期标准.

所以问题是:你将如何管理日期标准? column_property是满足这种需求的最佳解决方案吗?

谢谢你提前.

添加属性是获取与对象相关的某些数据库状态的好方法.但是使用外部标准参数,计数不仅仅是一个状态,而是一个函数.将对象属性等数据表示为不好.因此,直接查询其他数据(在下面的所有示例中计算比start_date更新的antries):

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))
相关文章
相关标签/搜索