P.S. An even better approach would be to remove the dropdown ...requires=[IS_NULL_OR(IS_IN_DB(db, 'auth_user.id'))] # note [..]
and use an autocomplete widget to allow to search for users. auth.settings.extra_fields['auth_user']=[Field('fullname',readable=False,writable=False,compute=lambda row: "%s %s" % (row.first_name,row.last_name))] and db.mytable.user_id.requires=[IS_NULL_OR(IS_IN_DB(db, 'auth_user.id'))] db.mytable.user_id.widget=SQLFORM.widgets.autocomplete(request,db.auth_user.fullname,db.auth_user.id,orderby=db.auth_user.fullname) On Sunday, 29 July 2012 07:19:32 UTC-5, Massimo Di Pierro wrote: > > First of all > > form = SQLFORM.factory(db.mytable, record=db.mytable[myindex]) > > should probably be > > form = SQLFORM(db.mytable, record=db.mytable[myindex]) > > Anyway. The slow down is due to the IS_IN_DB(db, 'auth_user.id') > validator. Every time you display the form, it will create a new dropdown > list with all your users. You may want to cache this: > > > Field('user_id', db.auth_user, > requires=IS_NULL_OR(IS_IN_DB(db, 'auth_user.id > ',cache=(cache.ram,3600))), > ), > > 3600 means the list will be re-built every hour. > > On Sunday, 29 July 2012 04:53:25 UTC-5, weheh wrote: >> >> I've got an SQLFORM.factory inside a model. Very standard stuff: >> >> form = SQLFORM.factory(db.mytable, record=db.mytable[myindex]) >> >> The problem is, as I insert users into db.auth_user, the above >> SQLFORM.factory statement takes longer and longer to execute. It begins by >> executing in 0.05 seconds when there are only 3 rows in db.auth_user. >> However, when db.auth_user grows to 10,000 rows, it takes 11.4 seconds to >> do the above assignment. At 100,000 rows it takes over 2 minutes. >> >> Any ideas where the trouble is? The db.mytable does have a user_id field >> that references auth_user: >> >> Field('user_id', db.auth_user, >> requires=IS_NULL_OR(IS_IN_DB(db, 'auth_user.id')), >> ), >> >> but I don't see how this could affect anything. This is a showstopper for >> me, so any help would be appreciated. Thanks. >> > --