Better example:

*# models/db.py*
...
db = DAL(".....")
...

*# modules/datamodels/base.py*

class BaseModel(object):
    def define_table(self):
        self.db.define_table(self.tablename, *self.fields, **self.params)

*# modules/datamodels/dog.py*

from gluon import current
from gluon.dal import Field
from datamodels.base import BaseModel

class Dog(BaseModel):
    def __init__(self, db):
        self.db = db
        self.T = current.T
        self.request = current.request
        self.tablename = "dog"

        self.fields = [
            Field("name", label=self.T("Dog name")),
            Field("guardian", "reference guardian"),
            ....
        ]

       self.params = dict(
           migrate=True,
           format="%(name)s"
       )


*# modules/datamodels/guardian.py*

from gluon import current
from gluon.dal import Field
from datamodels.base import BaseModel

class Guardian(BaseModel):
     def __init__(self, db):
          self.db = db
          self.tablename = "guardian"
          self.fields = [
              Field("name")
          ]

         self.params = dict(migrate=True)


*# models/guardian/0.py

*from datamodels.guardian import Guardian
guardian = Guardian(db)
guardian.define_table()

*# models/dog/0.py*

from datamodels.dog import Dog
from datamodels.guardian import Guardian

# dogs does not have owners, they have guardians!
guardian = Guardian(db)
guardian.define_table()

# dog have reference to guardian, so need to define it before
dog = Dog(db)
dog.define_table()

*# controllers/guardian.py*

def index():
     return db(db.guardian).select(0

*# controller/dog.py*

def index():
    return db(db.dog.guardian == db.guardian.id).select()

It could be a little better, a singleton, a way to define references
automatically etc...

Reply via email to