如何在web2py中设置唯一的多列

时间:2014-08-18 03:42:31

标签: mysql web2py requires

为了建立多对多的关系,我制作了一个中间表来组合两个表,这样的表是这样的:

db.define_table('problem',
                Field('task_id','reference task'),
                Field('title','string',unique=True,length=255))
db.define_table('task',
                Field('title','string',unique=True,length=255),
                Field('course_id','reference courses'))

db.define_table('belong',
                Field('task_id','reference task'),
                Field('problem_id','reference problem')
                )
db.belong.task_id.requires=IS_IN_DB(db,'task.id','%(title)s')
db.belong.problem_id.requires=IS_IN_DB(db,'problem.id','%(title)s')

我使用SQLFORM插入belong表。我希望没有重复的任务和问题。假设(1,task1,problem1)表中已存在belong之类的记录,那么如果我在SQLFORM中选择task1,如何使problem_id下拉列表不显示问题1。我发现了类似的问题here 并在db.py中执行以下测试:

test1:  

db.belong.problem_id.requires=IS_NOT_IN_DB(db(db.belong.task_id==request.vars.task_id),'belong.problem_id').

test2:

db.belong.problem_id.requires=IS_NOT_IN_DB(db(db.belong.task_id==request.vars.task_id),'problem.id','%(title)s').

TEST3:

def my_form_processing(form):
    a = form.vars.task_id
    b=form.vars.problem_id
    query=(db.belong.task_id==a)&(db.belong.problem_id==b)
    if query :
        form.errors.a= 'the record has existed'

def assignproblem():
    form=SQLFORM(db.belong)
    if form.process(onvalidation=my_form_processing).accepted:
        response.flash='form accepted'
    elif form.errors:
        response.flash='form has errors'
    else:
        response.flash='please fill out the form'
    return dict(form=form)

但仍未解决。

1 个答案:

答案 0 :(得分:1)

如果您希望problem_id下拉列表中的选项根据task_id选择动态更改,那么您将需要使用JavaScript(并且可能会生成Ajax请求以填充下拉列表)。有关可能的解决方案,请参阅this answer

对于上面的测试,test1应该进行正确的验证,但只有在提交表单之后(即表单将允许选择task_id和problem_id的任意组合,但如果重复组合则会报告错误已提交)。

test3不能正常工作,因为query对象只指定数据库查询而不实际从数据库中进行选择。相反,您必须调用.select()方法,或更简单地调用.count()方法:

if db((db.belong.task_id == a) & (db.belong.problem_id == b)).count():
    form.errors.a= 'the record has existed'