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...