Thanks, that worked like a charm. Look forward to your PyCon
presentation.

On Feb 2, 12:56 am, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Feb 1, 2010, at 9:24 PM, Andy (Zenom) wrote:
>
>
>
>
>
> > I don't know if my terminology is correct etc. But the basic idea is
> > the following.
>
> > In my model I have something like
>
> > from mylib.helpers import slugify
>
> > class MyModel(Base):
> >    __tablename__ = "testing"
>
> >   id = Column(Integer, primary_key)
> >   title = Column(Unicode)
> >   description = Column(Unicode)
>
> >   @property
> >   def slug(self):
> >        return slugify(self.title)
>
> > Now I want to be able to do something like.
> > session.query(MyModel.id, MyModel.title, MyModel.slug).all()
>
> > The table obviously doesn't have a slug column, I just want to return
> > my title as a "pseudo-column" named slug, with it passed through my
> > slugify method first.
>
> > I tried to do something like the following:
>
> > @synonym_for("title")
> > @property
> > def slug(self):
> >    return slugify(self.title)
>
> > And this did not work.  It seems to just return another column just
> > like title (not sent through slugify first).  Any idea how I can do
> > what I am looking for?
>
> part of the approach depends on if "slugify" can be defined as a SQL function 
> or if it must be executed in Python.  If the latter, you probably want 
> MyModel.slug to resolve into a column that also defines a custom type.
>
> Assuming its a Python function, note that your column can't be used 
> effectively in a comparison operation, like "MyModel.slug == 'foo'", since 
> the slugify() operation would have to be applied in aggregate.
>
> Anyway assuming non-SQL function, here's a hack I came up with that will do 
> it:
>
> from sqlalchemy import *
> from sqlalchemy.orm import *
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.sql.expression import _UnaryExpression
> from sqlalchemy.types import UserDefinedType
>
> Base = declarative_base()
>
> def slugify(text):
>     return "SLUG !" + text
>
> class MySlugType(UserDefinedType):
>     def result_processor(self, dialect, coltype):
>         return slugify
>
> class MyModel(Base):
>     __tablename__ = "testing"
>
>     id = Column(Integer, primary_key=True)
>     title = Column(Unicode)
>     description = Column(Unicode)
>
>     slug = column_property(_UnaryExpression(title, type_=MySlugType()))
>
> engine = create_engine('sqlite://', echo=True)
> Base.metadata.create_all(engine)
> session = sessionmaker(engine)()
>
> session.add(MyModel(title=u'title', description=u'description'))
> session.commit()
>
> print session.query(MyModel.title, MyModel.slug).all()
>
>
>
>
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "sqlalchemy" group.
> > To post to this group, send email to sqlalch...@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sqlalchemy+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to