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

Reply via email to