首页 > 解决方案 > 外键约束尽管在 web2py 中的引用表中引用了记录,但在为 id > 3 的用户使用 SQLFORM 时

问题描述

我收到“外键约束失败”错误。不过,我在引用的表中有记录。这只发生在登录用户身上。它适用于 id <= 3 的用户,但不适用于其他用户。

这是相关的 db.py 代码:

    db.define_table('Roles',    
            Field('person', db.auth_user),    
            Field('role'))    
    db.define_table('Doctors',
            Field('doctor', db.auth_user, required = True),    
            Field('age', 'integer', required = True),    
            Field('qualification'),    
            Field('specialization'),    
            format = '%(doctor)s'    
            )    

    db.define_table('Patients',    
            Field('patient', db.auth_user, required = True),    
            Field('age', 'integer', required = True),    
            Field('doctor', db.Doctors, required = True),     
            Field('temperature', 'double'),     
            Field('blood_pressure', 'double'),     
            Field('haemoglobin', 'double'),     
            Field('contact_name'),     
            Field('contact_phone', 'bigint'),     
            format = '%(patient)s'     
           )     

    db.define_table('Assignments',     
            Field('doctor', 'reference Doctors', unique = False),     
            Field('patient', 'reference Patients', unique = False))     

下面是相关的 default.py 代码:

def registerRole():    
role = int(request.args[0])    
form = FORM()    
if role == 1:    
    form = SQLFORM(db.Doctors).process()    
elif role == 2:    
    form = SQLFORM(db.Patients).process()    
if form.accepted:    
    response.flash = 'form accepted'    
    if role == 1:    
        db.Roles.insert(person = auth.user.id, role = 'doctor')
            auth.add_membership(auth.id_group('doctor'),auth.user.id)
        elif role == 2:
            i = 1
           db.Assignments.insert(doctor = int(form.vars.doctor), patient = auth.user.id)    
         db.Roles.insert(person = auth.user.id, role = 'patient')    
         auth.add_membership(auth.id_group('patient'),auth.user.id)    
     redirect(URL('index'))    
else:    
    response.flash = form.errors    
return dict(form = form, role = role)    

请帮我解决这个问题。我已经坚持了很长一段时间了。任何帮助表示赞赏。

标签: web2py

解决方案


db.Assignments.insert(doctor = int(form.vars.doctor), patient = auth.user.id)

上面您正在设置patientto的值auth.user.id,这是表id中的一个auth_user。但是,patient字段Assignments必须改为id来自Patients表的字段,因为它的类型是reference Patients。相反,您可能想要表单id刚刚插入的记录Patients,它位于form.vars.id

db.Assignments.insert(doctor = int(form.vars.doctor), patient = form.vars.id)

另外,请考虑auth.user.id始终是id当前登录用户的。尚不清楚您的其他用途auth.user.id是否合适(即,使用db.Roles.insertand auth.add_membership),因为在表单中选择为医生或患者的用户不一定是登录用户。


推荐阅读