Jér*_*eot 4 python sqlalchemy count
我有一些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))
...
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,这是非常经典的,用户写条目...我需要渲染一些关于它们的统计数据(比如每周/每月显示它们的条目......)
对于计数条目,我将column_property添加到用户模型,如下所示:
class User(Base):
...
entries_count = column_property(select([func.count(Entry.id)]).\
where(Entry.author_id==id))
Run Code Online (Sandbox Code Playgroud)
这让我可以看到用户已经写了多少条目.但是为了给出一些日期范围的统计数据,我需要动态调整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)
Run Code Online (Sandbox Code Playgroud)
或者在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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2469 次 |
| 最近记录: |