In DAL chapter on Web2py book, there's a section called "Query, Sets, Rows".It explains the use of the Query object in a very short way and doesn't explore its power.Let's see some examples to optimize your application, shorten your code and don't repeat yourself.Frequently used queries (i.e, common filtering by date):db.define_table('show', Field('name', 'string'), Field('seen_on', 'datetime'))rows1 = db((db.show.seen_on.month()==my_month) & \ (db.show.seen_on.year()==my_year)) \ .select(orderby='name')print rows1Now, if you want do the same query, plus filtering by name, too:rows2 = db((db.show.seen_on.month()==my_month) & \ (db.show.seen_on.year()==my_year) &\ (db.show.name.like('Mary %')) \ .select(orderby='name')print rows2See, date filtering part is duplicated. You can organize it in a better way, making your code like this:db.define_table('show', Field('name', 'string'), Field('seen_on', 'datetime'))db.show.my_filter = lambda m, y: db.show.seen_on.month()==m & \ db.show.seen_on.year()==yrows1 = db((db.show.my_filter(my_month, my_year)) \ .select(orderby='name')print rows1 rows2 = db((db.show.my_filter(my_month, my_year) & \ (db.show.name.like('Mary %')) \ .select(orderby='name')print rows2"Appending" personal filters to your table objects, you put them in a context and they goes everywhere with all other table properties and methods, throughout your application.You should make the same with joins. ;-)Naturally this example doesn't show all benefits, but imagine some common cases:a) Frequently used queries among your application: now they are standardized;b) Complex and long queries: now they don't mess your code anymore. And are better readable;c) Joins: now they are optimized and standardized.As bigger your application and your team gets, better are the benefits.What additional suggestion do you have to us? Tell us below. Detalhes fazem a diferenca, certo? O web2py se preocupa com eles para dar produtividade ao desenvolvedor.Uma boa ideia e o auth.signatureVamos a um exemplo:db.define_table('cadastro', Field('nome', 'string', length=100), Field('telefone', 'string', length=20), auth.signature)Esse comando vai criar uma tabela chamada cadastro com os campos id (criado automaticamente), nome e telefone, alem de: created_on, created_by, modified_on e modified_by.Isso faz com que possamos saber quando um registro foi incluido (created_on) ou alterado (modified_on).O auth.signature funciona automaticamente integrado ao sistema de autenticacao do web2py. Portanto, se um usuario logado incluir ou alterar o registro, o codigo de usuario dele ficara registrado nos campos created_by e modified_by.Fica ai a dica. No capitulo sobre DAL do livro de Web2py, existe uma secao chamada "Query, Sets, Rows".Ela explica como usar o objeto Query de uma forma bem resumida e nao explora todo o poder que ele tem.Vamos ver alguns exemplos de como otimizar sua aplicacao, encurtar seu codigo e praticar o principio DRY (don't repeat yourself).Consultas, ou queries, usadas com frequencia (p.ex, filtragem comum por datas):db.define_table('show', Field('name', 'string'), Field('seen_on', 'datetime'))rows1 = db((db.show.seen_on.month()==my_month) & \ (db.show.seen_on.year()==my_year)) \ .select(orderby='name')print rows1Agora, se voce quiser fazer a mesma query, mas filtrar tambem por nome:rows2 = db((db.show.seen_on.month()==my_month) & \ (db.show.seen_on.year()==my_year) &\ (db.show.name.like('Mary %')) \ .select(orderby='name')print rows2Viu? A parte que filtra por data esta duplicada. Organize isso de um jeito melhor fazendo assim:db.define_table('show', Field('name', 'string'), Field('seen_on', 'datetime'))db.show.my_filter = lambda m, y: db.show.seen_on.month()==m & \ db.show.seen_on.year()==yrows1 = db((db.show.my_filter(my_month, my_year)) \ .select(orderby='name')print rows1 rows2 = db((db.show.my_filter(my_month, my_year) & \ (db.show.name.like('Mary %')) \ .select(orderby='name')print rows2"Adicionando" os filtros aos seus objetos table, voce os coloca num contexto e eles estarao disponiveis em qualquer lugar da sua aplicacao, assim como os outros metodos e propriedades.Aconselho que voce faca o mesmo com seus