yeah i have a secret weapon for that sort of thing, called
"post_update"...you might be the first to use it.
this is a paraphrased version of how it would look, you have to fix
up the join conditions/backrefs to suit your tables:
mapper(Page, pages, properties={
'job': relation(Job, backref=backref('pages', cascade="all,
delete-orphan")),
'current_version' : relation(PageVersion,
primaryjoin=pages.c.currentversion==pageversions.c.version,
post_update=True),
'versions' : relation(PageVersion,
primaryjoin=pages.c.pagename==pageversions.c.pagename)
})
the idea of "post_update" is that its going to insert/update the row
on the "pages" table normally, then do the "versions", and then do a
*second* update on the "pages" table to get the "current_version"
foreign key in there.
ive had unit tests in place for this for quite some time now but lets
see if it works in a more complex scenario (if it doesnt work, then
your test cases will become new unit tests).
On Jun 14, 2006, at 11:35 AM, Arnar Birgisson wrote:
> Hi all,
>
> I have a model with three classes, Job, Page and PageVersions. A job
> has many pages and a page has many versions.
>
> Now, I use a combined primary key for Page and PageVersions (see code
> below) - and have "normal" relations to each other (job.pages,
> page.job, page.versions, pageversion.page etc.)
>
> Only one version of a page is "active", and is marked so with a
> boolean attribute on PageVersion. I would like to add a property on
> Page that points to that version (this would of course create a
> circular reference) - something like page.currentversion - with a
> corresponding Integer column "currentversion" on the pages table.
>
> Is this possible with SA given the kind of combined keys I'm using?
>
> The fallback solution is to do an eager-load on all pageversions
> attached to a page and handle this with a regular python property.
>
> Arnar
>
> jobs = Table("jobs", __meta__,
> Column("jobno", Unicode(15), primary_key=True),
> Column("created", DateTime, nullable=False,
> default=datetime.now))
>
> class Job(object):
> pass
>
> mapper(Job, jobs)
>
> pages = Table("pages", __meta__,
> Column("jobno", Unicode(15), ForeignKey("jobs.jobno"),
> primary_key=True),
> Column("pagename", Unicode(30), primary_key=True),
> Column("created", DateTime, nullable=False,
> default=datetime.now))
>
> class Page(object):
> pass
>
> mapper(Page, pages, properties={
> 'job': relation(Job, backref=backref('pages', cascade="all,
> delete-orphan"))
> })
>
> pageversions = Table("pageversions", __meta__,
> Column("jobno", Unicode(15), primary_key=True,
> ForeignKey("pages.jobno")),
> Column("pagename", Unicode(30), primary_key=True,
> ForeignKey("pages.pagename")),
> Column("version", Integer, primary_key=True),
> Column("created", DateTime, nullable=False,
> default=datetime.now),
> Column("active", Boolean, nullable=False,
> default=True))
>
> class PageVersion(object):
> pass
>
> mapper(PageVersion, pageversions, properties={
> 'page': relation(Page,backref=backref('versions', cascade="all,
> delete-orphan",
> lazy=False,
> order_by=pageversions.c.version))
> })
>
>
> _______________________________________________
> Sqlalchemy-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users
_______________________________________________
Sqlalchemy-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users