Thank You! And I found how to do that I want. I added support of 'native 
postgres inheritance' into web2py:

~/web2py/gluon/packages/dal/pydal/git diff
diff --git a/pydal/adapters/base.py b/pydal/adapters/base.py
index 94c6819..9ddfaad 100644
--- a/pydal/adapters/base.py
+++ b/pydal/adapters/base.py
@@ -417,11 +417,17 @@ class BaseAdapter(with_metaclass(AdapterMeta, 
ConnectionPool)):
             sql_fields_aux[field_name] = dict(sql=ftype)
             # Postgres - PostGIS:
             # geometry fields are added after the table has been created, 
not now
+            if field_name in table.inherit_fields:
+                continue
             if not (self.dbengine == 'postgres' and \
                         field_type.startswith('geom')):
                 fields.append('%s %s' % (field.sqlsafe_name, ftype))
         other = ';'
 
+        if table.inherit_tables:
+            other = 'INHERITS (%s);' % ','.join(self.QUOTE_TEMPLATE % 
inherit_table for inherit_table in table.inherit_tables)
+            fields.append('PRIMARY KEY (%s)' % (self.QUOTE_TEMPLATE % 
table._id.name))
+
         # backend-specific extensions to fields
         if self.dbengine == 'mysql':
             if not hasattr(table, "_primarykey"):
diff --git a/pydal/objects.py b/pydal/objects.py
index e63eaab..f0adb29 100644
--- a/pydal/objects.py
+++ b/pydal/objects.py
@@ -278,6 +278,8 @@ class Table(Serializable, BasicStorage):
             fieldnames.add(field.name)
             if field.type == 'id':
                 self._id = field
+        self.inherit_tables = []
+        self.inherit_fields = []
         for field in fields:
             if isinstance(field, (FieldVirtual, FieldMethod)):
                 virtual_fields.append(field)
@@ -287,10 +289,13 @@ class Table(Serializable, BasicStorage):
                 include_new(field)
             elif isinstance(field, Table):
                 table = field
+                self.inherit_tables.append(table._tablename)
+                self.inherit_fields.append('id')
                 for field in table:
                     if field.name not in fieldnames and field.type != 'id':
                         t2 = not table._actual and self._tablename
                        
 include_new(field.clone(point_self_references_to=t2))
+                        self.inherit_fields.append(field.name)
             elif isinstance(field, dict) and field['fieldname'] not in 
fieldnames:
                 include_new(Field(**field))
             elif not isinstance(field, (Field, Table)):


четверг, 28 января 2016 г., 4:24:24 UTC+5 пользователь Massimo Di Pierro 
написал:
>
> db.define_table('abonent', Field('a'))
> db.define_table('person', db.abonet, Field('b')) # has a,b
> db.define_table('company', db.abonet, Field('c')) # has a,c
> db.define_table('provider', db.company, Field('d')) # has a,c,d
>
>
> On Wednesday, 27 January 2016 17:05:57 UTC-6, RekGRpth wrote:
>>
>> I have 4 classes: Abonent, Person, Company and Provider.
>> Person and Company are (sublasses of) Abonents, and Provider is 
>> (subclasses of) Company.
>> In django I can write
>>
>> class Abonent(models.Model): passclass Person(Abonent): passclass 
>> Company(Abonent): passclass Provider(Company): pass
>>
>> how it will be in web2py?
>> follow does not works:
>>
>> db.define_table('abonent')
>> db.define_table('person', Field('abonent', db.abonent), 
>> primarykey=['abonent'])
>> db.define_table('company', Field('abonent', db.abonent), 
>> primarykey=['abonent'])
>> db.define_table('provider', Field('company', db.company), 
>> primarykey=['company'])
>>
>> and this
>>
>> db.define_table('abonent')
>> db.define_table('person', Field('abonent', db.abonent), 
>> primarykey=['abonent'])
>> db.define_table('company', Field('abonent', db.abonent), 
>> primarykey=['abonent'])
>> db.define_table('provider', Field('company', db.company.abonent), 
>> primarykey=['company'])
>>
>> and this
>>
>> db.define_table('abonent')
>> db.define_table('person', Field('abonent', type='reference abonent'), 
>> primarykey=['abonent'])
>> db.define_table('company', Field('abonent', type='reference abonent'), 
>> primarykey=['abonent'])
>> db.define_table('provider', Field('company', type='reference 
>> company.abonent'), primarykey=['company'])
>>
>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to