的web2py验证为组成员分贝模型

问题描述 投票:0回答:3

我使用的web2py,并正在试图建立一个AUTH_USER领域,应当确认为某组的成员。因此,在模型/ db.py我已经加入,告诉谁是用户的经理字段:

auth.settings.extra_fields['auth_user']=[Field('manager', 'reference auth_user')]

然后,我已经设置了db.auth_userdb.auth_groupdb.auth_membership包含属于集团的经理人用户

而我现在想实现的是验证用户输入的话,该auth_user的“经理”字段可以包含来自该集团的经理人只有用户。我经历了不少变化了,下面也许是最接近我的心学决策意识:

group_id = auth.id_group('managers') 
all_users_in_group = db(db.auth_membership.group_id==group_id)._select(db.auth_membership.user_id)
db.auth_user.auditor.requires = IS_IN_DB(db, db(~db.auth_user.id.belongs(all_users_in_group)).select(db.auth_user.id)) 

但是,即便是与失败

<type 'exceptions.AttributeError'>('Table' object has no attribute 'managers')

我的问题的完美解决方案将显示在下拉菜单中没有auth_user.id,但auth_user.first_name auth_user.last_name串联。

python web2py
3个回答
0
投票

你已经在你的answer正确地完成它,但你可以改善它。

验证的第一个参数可以是数据库连接或DAL集。所以,你可以直接传递一个数据库查询作为第一个参数,像这样

query = db((db.auth_membership.group_id == auth.id_group('managers')) &
           (db.auth_membership.user_id == db.auth_user.id))
db.auth_user.auditor.requires = IS_IN_DB(query, db.auth_user.id, '%(first_name)s %(last_name)s')

你也可以写查询象下面这样:

query = db((db.auth_group.role == 'managers') &
           (db.auth_membership.group_id == db.auth_group.id) &
           (db.auth_membership.user_id == db.auth_user.id))

1
投票

我已经使用类似的代码以下,确认是工作与web2py的2.17.2稳定+ timestamp.2018.10.06.18.54.02(运行在Nginx的/ 1.14.0,Python的3.6.7)。该前面的回答不会为工作这个版本。

group_id = auth.id_group('managers')
user_rows = db(db.auth_membership.group_id == group_id)._select(db.auth_membership.user_id)
query = db(db.auth_user.id.belongs(user_rows))
db.auth_user.auditor.requires = IS_IN_DB(query, db.auth_user.id, '%(first_name)s %(last_name)s'

0
投票

其实,我设法解决这个问题,但我绝对不会把这种优雅。会有在web2py中做到这一点更地道呢?下面是我添加到模型/ db.py

group_id = auth.id_group('managers')
rows=db(db.auth_membership.group_id==group_id).select(db.auth_membership.user_id)
rset=set()
for r in rows:
    rset.add(int((r.user_id)))

db.auth_user.auditor.requires = IS_IN_DB(db(db.auth_user.id.belongs(rset)), db.auth_user.id, '%(first_name)s %(last_name)s')
© www.soinside.com 2019 - 2024. All rights reserved.