首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >web2py,unique = True对表引用无效

web2py,unique = True对表引用无效
EN

Stack Overflow用户
提问于 2013-10-02 15:33:23
回答 1查看 1.3K关注 0票数 1

我只是试图创建一个简单的应用程序,其中两个表在模型中相互链接:

代码语言:javascript
运行
复制
db.define_table('project',
            Field('project_name','string',unique =True),
            auth.signature)
db.define_table('watershed',
            Field('project_name', requires = IS_IN_DB(db,db.project.project_name)),
            Field('main_watershed','string', unique =True),
            auth.signature)
db.watershed.main_watershed.requires = IS_NOT_EMPTY()

在主计长:

代码语言:javascript
运行
复制
def add_project():
form = SQLFORM(db.project).process()
if form.accepted: redirect('add_main')
return dict(form = form)

def add_main():
form = SQLFORM(db.watershed).process()
if form.accepted: redirect('add_main')
LIST = db(db.watershed).select()
return dict(form = form, LIST = LIST) 

假设用户调用default/ add _project并添加"Project 1",如果用户回忆默认/add_Project并再次添加"Project 1",则用户获取数据库中已经存在的错误值。

如果该进程进入默认/add_main,则如果用户添加(ex )。在main_watershed字段= MAIN 1)中,不会弹出相同的字符串。

有什么遗漏了吗?为什么我的价值不是独一无二的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-02 19:10:55

unique=True由数据库强制执行,而不是由表单验证过程执行。如果您试图插入一个已经在数据库中的值,数据库应该返回一个错误,这应该会在您的web2py应用程序中触发一个错误(但是您不会在表单上显示一个很好的错误消息)。如果希望表单验证检查副本,则应使用IS_NOT_IN_DB验证器:

代码语言:javascript
运行
复制
Field('main_watershed', 'string',
      requires=IS_NOT_IN_DB(db, 'watershed.main_watershed'))

此外,与其将"project_name“字段的副本存储在分水岭表中,不如将其作为引用字段:

代码语言:javascript
运行
复制
db.define_table('project',
    Field('project_name', 'string',unique =True),
    auth.signature,
    format='%(project_name)s')
db.define_table('watershed',
    Field('project', 'reference project'),
    Field('main_watershed', 'string',
          requires=IS_NOT_IN_DB(db, 'watershed.main_watershed')),
    auth.signature)

您还应该在重定向中使用URL()函数:redirect(URL('default', 'add_main'))

最后,为了更容易地为最近添加的项目添加分水岭,您可以考虑将项目的id传递给add_main函数,并将其设置为项目的默认值:

代码语言:javascript
运行
复制
def add_project():
    form = SQLFORM(db.project).process()
    if form.accepted:
        redirect(URL('default', 'add_main', args=form.vars.id))
    return dict(form = form)

def add_main():
    project_id = request.args(0, cast=int, default=None)
    db.watershed.project.default = project_id
    form = SQLFORM(db.watershed).process()
    if form.accepted:
        redirect(URL('default', 'add_main', args=project_id)
    LIST = db(db.watershed).select()
    return dict(form = form, LIST = LIST) 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19140787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档