web2py - 外键约束尽管在 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)
请帮我解决这个问题。我已经坚持了很长一段时间了。任何帮助表示赞赏。
解决方案
db.Assignments.insert(doctor = int(form.vars.doctor), patient = auth.user.id)
上面您正在设置patient
to的值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.insert
and auth.add_membership
),因为在表单中选择为医生或患者的用户不一定是登录用户。
推荐阅读
- magento2 - 如何在产品详细信息页面上显示属性值 magento 2
- spring - 如何在 Spring 或 Spring Boot 的 Spring Mongo 数据中以编程方式创建复合索引?
- python-3.x - 每天随机执行脚本
- r - insertImage 函数失败(R 包“openxlsx”)
- .net - 带有 Autofac 的 ASP.Net Core 3 忽略 iis 设置;日志显示“现在正在监听:http://localhost:5000”
- string - Table.insert 表参数被识别为字符串
- wso2 - 如何正确保证 WSO2 MB 配置文件集群的高可用性要求?
- java - 从 JAR 文件中读取目录内容
- javascript - 选择选项更改 URL
- regex - 标记同一目录下多个文本文件中的所有英文单词