And just to be clear, defining models in modules and defining modules using 
classes are two independent design decisions -- you can use classes even in 
regular model files, and you can use modules without using classes. If you 
want, you can just use regular functions in modules:

*/modules/mymodule.py:*

from gluon import Field

def mymodels(db):
    db.define_table('table1', Field('field1'), Field('field2'))
    db.define_table('table2', Field('field1'), Field('field2'))

*/models/db.py or /controllers/some_controller.py:*

from mymodule import mymodels
mymodels(db)

If you just want to take some existing table definitions and move them from 
a model file to a module, the above is a simple approach. Anyway, it's just 
Python -- do it however you like. :-)

Anthony

On Tuesday, May 15, 2012 3:41:53 PM UTC-4, rochacbruno wrote:
>
> 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