web2py creates a auto-incrementing primary key ID field on all tables so it will work with any supported database. There is an ondelete attribute on Field that defaults to CASCADE. I think you can change it to SET NULL to get the desired behavior. It's applicable only for reference and upload fields.
On Jun 7, 8:43 pm, Jason Lotz <jayl...@gmail.com> wrote: > Thanks mr.freeze!! That got me in the right direction. > > The dept_id comes from long time with Oracle and M$ SQLServer, also I > thought it would be nice to make the database structure easily > compatible with other platforms. I don't know about PostgreSQL but from > what I understand, MySQL doesn't automatically implement row_id like > SQLite? Anyways I will just structure for SQLite and worry about other > platforms later. > > Actually another quick question, can one implement triggers/procedures > to SQLite/MySQL from web2py? I notice that web2py appadmin runs some > procedure to delete parent records. Following my example below, using > the appadmin, if I delete create dept_name = 'Management' & create an > employee = 'Bob Johnson, Management'. Then delete 'Management' from > db.department it will also delete Bob Johnson from employee (and other > record with relation to 'Management'). It would be nice to implement a > procedure that instead of deleting record from employee it would update > employee.dept_id = None. Is such possible? > > On 06/08/2010 12:38 AM, mr.freeze wrote: > > > I don't think your model is not setup with the correct reference > > fields. Try this: > > > db.define_table('department', > > Field('dept_id'), > > Field('dept_name'),format='%(name)s') > > db.define_table('employee', > > Field('firstName'), > > Field('lastName'), > > Field('dept_id', db.department)) > > > Passing the format parameter to the department table will create the > > default validators and represent attributes so that it shows the name > > instead of the id. > > > The dept_id field on the department table seems redundant as the table > > will already have an ID field automatically. > > > On Jun 7, 9:24 am, Jason Lotz<jayl...@gmail.com> wrote: > > >> Creating a custom crud.read form and I would like to show the > >> field.requires=IS_IN_DB field rather than the table.id . Sorry if that > >> doesn't make much sense. I have two related tables. > > >> db.define_table('employee', Field('firstName'), Field('lastName'), > >> Field('dept_id')) > >> db.define_table('department', Field('dept_id'), Field('dept_name')) > >> db.employee.dept_id.requires=IS_NULL_OR(IS_IN_DB(db,'department.dept_id','department.dept_name')) > > >> I would like to make a custom form to show the employee name and > >> department. > > >> def employee_form(): > >> form = crud.read(db.employee, request.args[0]) > >> return dict(form=form) > > >> ## View > >> {{=form.custom.begin}} > >> First Name: {{=form.custom.widget.firstName}} > >> Last Name: {{=form.custom.widget.lastName}} > >> Department: {{=form.custom.widget.dept_id}} > >> {{=form.custom.end}} > > >> This returns the actual dept_id for the Department, but I would like > >> to return the dept_name. Is there a better method to accomplish this > >> or can some explain custom widgets. I have read the book for custom > >> widgets but didn't completely understand it. > >