From a8059ba8029964d4fbe1cc2fdbc2f63eefb4473e Mon Sep 17 00:00:00 2001 From: Konsta Vesterinen Date: Thu, 23 Jan 2014 10:07:35 +0200 Subject: [PATCH] Add docs for m2m aggregates --- sqlalchemy_utils/aggregates.py | 48 ++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/sqlalchemy_utils/aggregates.py b/sqlalchemy_utils/aggregates.py index 3be41b3..8c2a92a 100644 --- a/sqlalchemy_utils/aggregates.py +++ b/sqlalchemy_utils/aggregates.py @@ -205,6 +205,54 @@ to define lots of relationships pointing to same class, remember to define the r customer_id = sa.Column(sa.Integer, sa.ForeignKey(Customer.id)) +Many-to-Many aggregates +----------------------- + +Aggregate expressions also support many-to-many relationships. The usual use scenarios includes things such as: + +1. Friend count of a user +2. Group count where given user belongs to + +:: + + + user_group = sa.Table('user_group', Base.metadata, + sa.Column('user_id', sa.Integer, sa.ForeignKey('user.id')), + sa.Column('group_id', sa.Integer, sa.ForeignKey('group.id')) + ) + + + class User(Base): + __tablename__ = 'user' + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column(sa.Unicode(255)) + + @aggregated('groups', sa.Column(sa.Integer, default=0)) + def group_count(self): + return sa.func.count('1') + + groups = sa.orm.relationship( + 'Group', + backref='users', + secondary=user_group + ) + + + class Group(Base): + __tablename__ = 'group' + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column(sa.Unicode(255)) + + + + user = User(name=u'John Matrix') + user.groups = [Group(name=u'Group A'), Group(name=u'Group B')] + + session.add(user) + session.commit() + + session.refresh(user) + user.group_count # 2 Multi-level aggregates