我有一些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是满足这种需求的最佳解决方案吗?
先谢谢。
答案 0 :(得分:7)
添加属性是获取与对象相关的某些数据库状态的好方法。但是使用外部标准参数,计数不仅仅是一个状态,而是一个函数。将对象属性等数据表示为不好。因此,直接查询其他数据(在下面的所有示例中计算比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))