Thanks Anthony, your active support to this group is great!
I solved the symmetric self relationship integrity this way:
db.define_table('person',
Field('name', requires=IS_NOT_EMPTY()),
Field('partnet', 'reference person', ondelete='NO ACTION',
requires =
IS_EMPTY_OR(IS_IN_DB(db,'person.id','%(name)s'))),
format = '%(name)s')
def partnet_insert(f, id):
if f.partnet:
db(db.person.id == f.partnet).update_naive(partnet = id)
def partnet_update(s, f):
id = request.args[3]
if f.partnet:
db(db.person.id == f.partnet).update_naive(partnet = id)
db((db.person.partnet == id) & (db.person.id !=
f.partnet)).update_naive(partnet = '')
db((db.person.partnet == f.partnet) & (db.person.id !=
id)).update_naive(partnet = '')
def partnet_delete(s):
id = request.args[3]
db(db.person.partnet == id).update_naive(partnet = '')
db.person._after_insert.append(partnet_insert)
db.person._after_update.append(partnet_update)
db.person._before_delete.append(partnet_delete)
On the controler:
@auth.requires_login()
def persons():
grid = SQLFORM.smartgrid(db.person, orderby=db.person.name)
return locals()
It works great, but I still need to *filter *the drop-down select on
create/update a person's record in the SQLFORM.smartgrid:
- A person cannot select himself as his partnet
- A person can only select a partner that is single
db((db.person.partner == None) & (db.person.id != *current.id*)).select()
Is this posible?
El viernes, 20 de abril de 2018, 21:16:59 (UTC+2), Anthony escribió:
>
> On Friday, April 20, 2018 at 2:32:45 PM UTC-4, JSalvat wrote:
>>
>> Hello,
>>
>> Why on update/insert a record with a non-empty partner, the partner does
>> not get updated as well with the backwards reference?
>>
>> db.define_table('person',
>> Field('name', requires=IS_NOT_EMPTY()),
>> Field('partner', 'reference person',
>> requires=IS_EMPTY_OR(IS_IN_DB(db,'person.id'))))
>>
>> db.person.insert(name='John')
>> 1
>> >>> for person in db().select(db.person.ALL):
>> ... print person.id, ' - ', person.name, ' - ', person.partner
>> ...
>> 1 - John - None
>>
>> db.person.insert(name='Maria', partner=1)
>> 2
>> >>> for person in db().select(db.person.ALL):
>> ... print person.id, ' - ', person.name, ' - ', person.partner
>> ...
>> 1 - John - None
>> 2 - Maria - 1
>>
>> Should not be this the result, since is a reciprocal relation?
>>
>
> No, neither web2py nor the database know this is a symmetric relationship
> (what if the self reference field was something like "manager"?). You got
> exactly what you inserted.
>
> Anthony
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.