Generates decorator

sqlalchemy_utils.decorators.generates(attr, source=None, generator=<sqlalchemy_utils.decorators.AttributeValueGenerator object at 0x7f35b6b48b90>)[source]

Deprecated since version 0.28.0: Use observer.observes() instead.

Decorator that marks given function as attribute value generator.

Many times you may have generated property values. Usual cases include slugs from names or resized thumbnails from images.

SQLAlchemy-Utils provides a way to do this easily with generates decorator:

class Article(Base):
    __tablename__ = 'article'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.Unicode(255))
    slug = sa.Column(sa.Unicode(255))

    @generates(slug)
    def _create_slug(self):
        return self.name.lower().replace(' ', '-')


article = self.Article()
article.name = u'some article name'
self.session.add(article)
self.session.flush()
assert article.slug == u'some-article-name'

You can also pass the attribute name as a string argument for generates:

class Article(Base):
    ...

    @generates('slug')
    def _create_slug(self):
        return self.name.lower().replace(' ', '-')

These property generators can even be defined outside classes:

class Article(Base):
    __tablename__ = 'article'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.Unicode(255))
    slug = sa.Column(sa.Unicode(255))


@generates(Article.slug)
def _create_article_slug(article):
    return article.name.lower().replace(' ', '-')

Property generators can have sources outside:

class Document(self.Base):
    __tablename__ = 'document'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.Unicode(255))
    locale = sa.Column(sa.String(10))


class Section(self.Base):
    __tablename__ = 'section'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.Unicode(255))
    locale = sa.Column(sa.String(10))

    document_id = sa.Column(
        sa.Integer, sa.ForeignKey(Document.id)
    )

    document = sa.orm.relationship(Document)

    @generates(locale, source='document')
    def copy_locale(self, document):
        return document.locale

You can also use dotted attribute paths for deep relationship paths:

class SubSection(self.Base):
    __tablename__ = 'subsection'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.Unicode(255))
    locale = sa.Column(sa.String(10))

    section_id = sa.Column(
        sa.Integer, sa.ForeignKey(Section.id)
    )

    section = sa.orm.relationship(Section)

    @generates(locale, source='section.document')
    def copy_locale(self, document):
        return document.locale

Previous topic

Observers

Next topic

Internationalization

This Page