I have now moved on a bit and came up against a brick wall :/

I have a ClassifiedPage instance which inherits from MagazinePage which
in-turn inherits from Page.

Log:

[2006-05-30 21:43:25,602] [engine]: INSERT INTO page (page_no, type)
VALUES (?, ?)
[2006-05-30 21:43:25,602] [engine]: [1, 'c']
[2006-05-30 21:43:25,603] [engine]: INSERT INTO magazine_page (page_id,
magazine_id, orders) VALUES (?, ?, ?)
[2006-05-30 21:43:25,603] [engine]: ['0', 1, '']
[2006-05-30 21:43:25,605] [engine]: INSERT INTO classified_page
(magazine_page_id, titles) VALUES (?, ?)
[2006-05-30 21:43:25,605] [engine]: [0, '']
[2006-05-30 21:43:25,607] [engine]: COMMIT

As you can see, the inheritance tree works, except that the
magazine.page_id and classified.page_id are not being correctly updated.

I have included a patch to the test.py I attached in my previous mail.

Do I need to create a separate polymorphic_union for ClassifiedPage? and
if so, what would that look like?

TIA ...

Nick

Michael Bayer wrote:
> Hey Nick -
> 
> I ran this test (which is well-written, youve understood the docs very
> well) with my favorite constraint checker, Postgres, and it does in fact
> fail on 0.2.1.  Fortunately, it does not fail when testing with the
> fixes I have just made today, i think its the same issue someone else
> raised today (a lot has changed with the persistence mechanism with
> regards to inheritance structures recently).  Try checking out the
> trunk, rev 1554.  also, one slight change to your program:

[[ snip ]]

--- test.py     2006-05-30 21:38:53.000000000 +0100
+++ test.py     2006-05-30 21:41:56.000000000 +0100
@@ -50,7 +50,7 @@
     Column('name', String(45), default=''),
 )
 
-# mapping objects
+# set-up mappers
 
 class BaseObject(object):
     def __init__(self, *args, **kwargs):
@@ -103,14 +103,11 @@
     pass
 
 class MagazinePage(Page):
-    def __init__(self, *args, **kwargs):
-        Page.__init__(self, *args, **kwargs)
+    pass
 
 class ClassifiedPage(MagazinePage):
     pass
 
-# define mapping
-
 publication_mapper = mapper(Publication, publication_table)
 
 issue_mapper = mapper(Issue, issue_table, properties = {
@@ -131,6 +128,7 @@
 page_join = polymorphic_union(
     {
         'm': page_table.join(magazine_page_table),
+        'c': page_table.join(magazine_page_table).join(classified_page_table),
         'p': page_table.select(page_table.c.type=='p'),
     }, None, 'page_join')
 
@@ -142,12 +140,10 @@
 page_mapper = mapper(Page, page_table, select_table=page_join, 
polymorphic_on=page_join.c.type, polymorphic_identity='p')
 
 magazine_page_mapper = mapper(MagazinePage, magazine_page_table, 
inherits=page_mapper, polymorphic_identity='m', properties={
-    'magazine': relation(Magazine)
+    'magazine': relation(Magazine, backref=backref('pages', cascade='all, 
delete-orphan'))
 })
 
-magazine_mapper.add_property('pages', relation(MagazinePage, lazy=True, 
private=True))
-
-#classified_page_mapper = mapper(ClassifiedPage, classified_page_table, 
inherits=MagazinePage.mapper, polymorphic_identity='c')
+classified_page_mapper = mapper(ClassifiedPage, classified_page_table, 
inherits=magazine_page_mapper, polymorphic_identity='c')
 
 session = objectstore.get_session()
 
@@ -166,9 +162,10 @@
     
 magazine = Magazine(location=location,size=page_size)
 
-page = MagazinePage(magazine=magazine,page_no=1)
+page = ClassifiedPage(magazine=magazine,page_no=1)
 
 session.flush()
+session.clear()
 
 '''
 p = session.query(Publication).selectone_by(name='Test')

Reply via email to