hybrid_method
is a callable within the sqlalchemy.ext.hybrid
module of the SQLAlchemy project.
HYBRID_PROPERTY,
hybrid_method,
and hybrid_property
are several other callables with code examples from the same sqlalchemy.ext.hybrid
package.
SQLAlchemy Mixins (PyPI package information) is a collection of mixins useful for extending SQLAlchemy and simplifying your database-interacting code for some common use cases. SQLAlchemy Mixins is open sourced under the MIT license.
SQLAlchemy Mixins / sqlalchemy_mixins / tests / test_smartquery.py
# test_smartquery.py
import unittest
import datetime
import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy import event
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
from sqlalchemy.orm import Session
from sqlalchemy_mixins import SmartQueryMixin, smart_query
from sqlalchemy_mixins.eagerload import JOINED, SUBQUERY
Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=False)
sess = Session(engine)
class BaseModel(Base, SmartQueryMixin):
__abstract__ = True
pass
class User(BaseModel):
__tablename__ = 'user'
__repr_attrs__ = ['name']
id = sa.Column(sa.Integer, primary_key=True)
name = sa.Column(sa.String)
posts = sa.orm.relationship('Post')
comments = sa.orm.relationship('Comment')
class Post(BaseModel):
__tablename__ = 'post'
id = sa.Column(sa.Integer, primary_key=True)
body = sa.Column(sa.String)
user_id = sa.Column(sa.Integer, sa.ForeignKey('user.id'))
archived = sa.Column(sa.Boolean, default=False)
user = sa.orm.relationship('User')
comments = sa.orm.relationship('Comment')
@hybrid_property
def public(self):
return not self.archived
@public.expression
def public(cls):
return -cls.archived
@hybrid_method
def is_commented_by_user(cls, user, mapper=None):
mapper = mapper or cls
return mapper.comments.any(Comment.user_id == user.id)
@hybrid_method
def is_public(cls, value, mapper=None):
mapper = mapper or cls
return mapper.public == value
class Comment(BaseModel):
__tablename__ = 'comment'
__repr_attrs__ = ['body']
id = sa.Column(sa.Integer, primary_key=True)
body = sa.Column(sa.String)
user_id = sa.Column(sa.Integer, sa.ForeignKey('user.id'))
post_id = sa.Column(sa.Integer, sa.ForeignKey('post.id'))
rating = sa.Column(sa.Integer)
created_at = sa.Column(sa.DateTime)
user = sa.orm.relationship('User')
post = sa.orm.relationship('Post')
class BaseTest(unittest.TestCase):
def setUp(self):
sess.rollback()
BaseModel.set_session(None)
## ... source file continues with no further hybrid_method examples...