also consider that if you want to retrieve a Content item by language, and a particular Content item only has *one* language which is distinct from another Content item of the same content id but a different language id, then the language id is part of its identity and is not a relation, hence the mapper must map to it:
s = select([content, lang_str.c.value, lang.c.name], and_( lang_str.c.lang_id==lang.c.lang_id, content.c.content_id==lang_str.c.lang_id ) ) m = mapper (Content, s, primary_key=[content.c.content_id, lang_str.c.lang_id], properties={'lang':lang.c.name}) content = m.get_by(id=12345, lang='de') that wont quite get you all the way since it wont save...you probably need a MapperExtension to give it a little kick upon save to get the correct "lang id" in there. also id like to enhance mapping to be able to save rows to a "many-to-many" select like the above properly. I also have a different view of this, involving storing many fields of Content in separate rows within a "vertical table" structure (which this almost seems like), which is probably worth another blog article. Florian Boesch wrote: > Now what, I thought about the problem, and I think there's a nicer concept > then > outfactoring just the title. > > From a rational point of view the title is the first snipple of data a > content > can be associated with. A content has always a unique name, but it can > have > many data associations that primarly differ in language (or some other > aspect). > And then anybody who wants to do specialized content derives from content > data, > as this is the logical thing to do. > > Quoting Florian Boesch <[EMAIL PROTECTED]>: > >> I'd fancy something like >> >> Content.mapper.get_by(id=12345, lang='de') >> >> Quoting Michael Bayer <[EMAIL PROTECTED]>: >> >> > youre still not showing me what the code to talk to the Content >> > object looks like. >> > >> > ill start: >> > >> > c = Content.mapper.get_by(story_id=4352) >> > >> > print "The title in english is:" c. .....?? >> > >> > print "the title in french is:" c. .....??? >> > >> > also are there other fields here ? body content ? summary? >> > >> > print "the body in english is:" c. ....??? >> > >> > I doubt I'd use a simple relation for this, particularly if you want >> > to load only one language at a time, as there will be some kind of >> > further query criterion inside there asking for language X, and a >> > relation does not handle per-request criterion (if thats what youre >> > really looking for, this would become an issue of....should there be >> > a jillion zillion switches and options to do things (the so-called >> > Humane interface) or should there be a small vocabulary of constructs >> > that are composed together by a programmer? ) >> > >> > On Mar 23, 2006, at 2:33 AM, Florian Boesch wrote: >> > >> > > Cleverly observed :D yes it is only half the question. >> > > I guess pulling all lang-titles eager and then doing the decision >> > > programmatically is the feasible thing to to-do. >> > > >> > > However =), >> > > >> > > traditionally you'd solve that problem by "select content.id as id, >> > > lang_str.title as title from content, lang_str, lang where >> > > lang_str.lang_id = >> > > lang.id and lang_str.content_id = content.id and lang.name := >> > > language and >> > > whatever else". That'd be a tad more efficient. >> > > >> > > Quoting Michael Bayer <[EMAIL PROTECTED]>: >> > > >> > >> this is only half of a question. what is the completed interface >> > >> youd like to see on the Content class, whereby i want the title in >> a >> > >> certain language? >> > >> >> > >> the solution, since it seems youre looking for something eager, >> would >> > >> involve just making a relation to load in all the titles >> represented >> > >> in the lang_str table for the "title" attribute, which would be >> named >> > >> something "hidden" like "_title", then implementing some interface >> on >> > >> Content that pulls from that already-loaded (or lazily-loaded) pool >> > >> of title fields. >> > >> >> > >> to make it more efficient to pull the title of a certain language >> > >> from this relation, you can subsitutite your own dictionary-like >> > >> object which has an "append" method for the "_title" attribute that >> > >> hashes based on the incoming language, as the mapper adds data to >> it. >> > >> >> > >> >> > >> On Mar 22, 2006, at 8:24 AM, Florian Boesch wrote: >> > >> >> > >>> A simple problem. Multi-language support. >> > >>> >> > >>> Say I have content which can have a title in different languages. >> > >>> So I have a >> > >>> >> > >>> content = Table('content', engine, >> > >>> Column('id', Integer, Sequence('content_seq'), primary_key=True)) >> > >>> >> > >>> so I also have a >> > >>> >> > >>> lang = Table('lang', engine, >> > >>> Column('id', Integer, Sequence('lang_seq'), primary_key=True), >> > >>> Column('name', String(255)) >> > >>> >> > >>> this contains things like VALUES('de') etc. >> > >>> >> > >>> lang_str = Table('lang_str', engine, >> > >>> Column('lang_id', Integer, ForeignKey('lang.id')), >> > >>> Column('content_id', Integer, ForeignKey('content.id')), >> > >>> Column('value', String(2048))) >> > >>> >> > >>> The problem is with the mapper and the relation to the title. >> > >>> >> > >>> class Content(object): pass >> > >>> contents = mapper(Content, content) >> > >>> contents.add_property('title', ...? >> > >>> >> > >>> etc. now the two questions. >> > >>> >> > >>> a) How do I make a relation that gives me the lang_str.value as >> > >>> it's value so >> > >>> I do not have to write somecontent.title.value >> > >>> >> > >>> b) How do I make the relation "customizable", i.e. I do not have >> to >> > >>> do many >> > >>> relations for each language I want support for (no >> > >>> mycontent.title_de.value, >> > >>> mycontent.title_en.value etc.? >> > >>> >> > >>> I do know how to customize for a fixed value via the secondaryjoin >> > >>> of relation, >> > >>> but I'm uncliear how I can parametrize this. (for that matter, I >> > >>> could of >> > >>> course write a member to my class who does this, but then I loose >> > >>> eager-loading >> > >>> for titles...) >> > >>> >> > >>> Cheers, >> > >>> Florian >> > >>> >> > >>> >> > >>> >> > >>> ------------------------------------------------------- >> > >>> This SF.Net email is sponsored by xPML, a groundbreaking scripting >> > >>> language >> > >>> that extends applications into web and mobile media. Attend the >> > >>> live webcast >> > >>> and join the prime developer group breaking into this new coding >> > >>> territory! >> > >>> http://sel.as-us.falkag.net/sel? >> > >>> cmd=lnk&kid=110944&bid=241720&dat=121642 >> > >>> _______________________________________________ >> > >>> Sqlalchemy-users mailing list >> > >>> Sqlalchemy-users@lists.sourceforge.net >> > >>> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users >> > >> >> > >> >> > >> >> > >> ------------------------------------------------------- >> > >> This SF.Net email is sponsored by xPML, a groundbreaking scripting >> > >> language >> > >> that extends applications into web and mobile media. Attend the >> > >> live webcast >> > >> and join the prime developer group breaking into this new coding >> > >> territory! >> > >> http://sel.as-us.falkag.net/sel? >> > >> cmd=lnk&kid=110944&bid=241720&dat=121642 >> > >> _______________________________________________ >> > >> Sqlalchemy-users mailing list >> > >> Sqlalchemy-users@lists.sourceforge.net >> > >> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users >> > >> >> > >> >> > > >> > > >> > > >> > > >> > > ------------------------------------------------------- >> > > This SF.Net email is sponsored by xPML, a groundbreaking scripting >> > > language >> > > that extends applications into web and mobile media. Attend the >> > > live webcast >> > > and join the prime developer group breaking into this new coding >> > > territory! >> > > http://sel.as-us.falkag.net/sel? >> > > cmd=lnk&kid=110944&bid=241720&dat=121642 >> > > _______________________________________________ >> > > Sqlalchemy-users mailing list >> > > Sqlalchemy-users@lists.sourceforge.net >> > > https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users >> > >> > >> > >> > ------------------------------------------------------- >> > This SF.Net email is sponsored by xPML, a groundbreaking scripting >> language >> > that extends applications into web and mobile media. Attend the live >> webcast >> > and join the prime developer group breaking into this new coding >> territory! >> > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 >> > _______________________________________________ >> > Sqlalchemy-users mailing list >> > Sqlalchemy-users@lists.sourceforge.net >> > https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users >> > >> > >> >> >> >> >> ------------------------------------------------------- >> This SF.Net email is sponsored by xPML, a groundbreaking scripting >> language >> that extends applications into web and mobile media. Attend the live >> webcast >> and join the prime developer group breaking into this new coding >> territory! >> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 >> _______________________________________________ >> Sqlalchemy-users mailing list >> Sqlalchemy-users@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users >> >> > > > > > ------------------------------------------------------- > This SF.Net email is sponsored by xPML, a groundbreaking scripting > language > that extends applications into web and mobile media. Attend the live > webcast > and join the prime developer group breaking into this new coding > territory! > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 > _______________________________________________ > Sqlalchemy-users mailing list > Sqlalchemy-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users > ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ Sqlalchemy-users mailing list Sqlalchemy-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users