【问题标题】:web2py validating db model for group menbersweb2py 验证组成员的数据库模型
【发布时间】:2016-11-24 14:16:07
【问题描述】:

我正在使用 web2py,并且正在尝试为 auth_user 构建一个字段,该字段应该被验证为某个组的成员。所以,在 models/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_nameauth_user.last_name 连接。

【问题讨论】:

    标签: python web2py


    【解决方案1】:

    我使用了与以下类似的代码,并确认它适用于 web2py 2.17.2-stable+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'
    

    【讨论】:

    • @DebanjanB 谢谢,我添加了更多关于为什么发布代码的解释性评论。
    【解决方案2】:

    您在answer 中已正确完成,但您可以改进它。

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

    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))
    

    【讨论】:

      【解决方案3】:

      我实际上设法解决了这个问题,但我绝对不会称之为优雅。在 web2py 中是否有更惯用的方法来做到这一点?以下是我添加到 models/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')
      

      【讨论】:

        猜你喜欢
        • 2015-09-30
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多