Experimentally there is a new feature in trunk.

Field('name','list:string')
Field('name','list:integer')
Field('name','list:reference other table')

and new operators

db.mytable.myfield.contains(4)

which works for list:reference, list:integer, list:string, string and
text types.

The list: type are mapped differently on RDBS ([1,2,3]->'|1|2|3|') and
on GAE (uses a string list propery). It is backward compatible with
data stored using the IS_IN_DB(...,multiple=True). So here is an
example of a program:

# model
db.define_table('product',Field('name'),format='%(name)s')
db.define_table('purchase',Field('code'),Field('products','list:reference
product'))

# controller
def products():
     db.product.id.represent=lambda id: A('click
me',_href=URL('purchases_by_product',args=id))
     return
dict(form=crud.create(db.product),items=db(db.product.id>0).select())
def purchases():
     return
dict(form=crud.create(db.purchase),items=db(db.purchase.id>0).select())
def purchases_by_product():
     product_id=request.args(0)
     return
dict(items=db(db.purchase.products.contains(product_id)).select())

Now register some products. When you try register purchases you should
automatically get a SELECT window with product names. The list of
items should also show a comma separated list of product names.

I have not tested this on GAE. I could use some tests. Please let me
know.

Massimo







Reply via email to