This is now fixed. Here is a final example of usage:

db=DAL('gae')
db.define_table('contact',Field('address'), polymodel=True)
db.define_table('person',Field('first_name'), db.contact,
polymodel=db.contact)
db.define_table('company',Field('business_name'),db.contact,polymodel=db.contact)

if not db(db.contact.id>0).count():
    db.person.insert(first_name="John", address='here')
    db.company.insert(business_name="John Inc", address='there')

persons = db(db.person.id>0).select()
companies = db(db.company.id>0).select()
contacts = db(db.contact.id>0).select()
# latter includes both people and companies


Mind that you can do:

  db.define_table('person',Field('first_name'), db.contact,
polymodel=db.contact)

or

  db.define_table('person',db.contact, Field('first_name'),
polymodel=db.contact)

I.e. you must choose explicitly whether the fields of the extended
class should appear after or before the new fields.

On Sep 10, 3:27 pm, Dave <[email protected]> wrote:
> It still has both the original problems.  Here's what I'm testing so
> far:
>
> >contacts = db(db.contact.id>0).select()
>
> Returns all contacts, as it should
>
> >people = db(db.person.id>0).select()
>
> Also returns all contacts, instead of just the contacts that are of
> type "person"
>
> >address = people[0].address
>
> Works, and returns the address of the first person.
>
> >name = people[0].first_name
>
> Crashes, with the following trace:
>
> Traceback (most recent call last):
>   File "C:\Users\Dave\Documents\Python\web2py\gluon\restricted.py",
> line 188, in restricted
>     exec ccode in environment
>   File "C:\Users\Dave\Documents\Python\web2py\applications\welcome/
> controllers/default.py:index", line 66, in <module>
>   File "C:\Users\Dave\Documents\Python\web2py\gluon\globals.py", line
> 96, in <lambda>
>     self._caller = lambda f: f()
>   File "C:\Users\Dave\Documents\Python\web2py\applications\welcome/
> controllers/default.py:index", line 23, in index
>   File "C:\Users\Dave\Documents\Python\web2py\gluon\sql.py", line 729,
> in __getattr__
>     return dict.__getitem__(self,key)
> KeyError: 'first_name'

Reply via email to