gpt4 book ai didi

lambda - 在 Web2py 中使用 lambda 作为模型默认值

转载 作者:行者123 更新时间:2023-12-02 11:30:49 26 4
gpt4 key购买 nike

我尝试使用 lambda 根据中的值设置默认值另一张 table 。

这是我的模型:

db.define_table('trip_instance', timestamp, sos_table, 
Field('trip_type_id', db.trip_type, label='Trip Type',
widget=trip_select_widget, requires = IS_IN_DB(db, 'trip_type.id', '%
(name)s'), represent=lambda id:db.trip_type(id)['name']),
Field('total_slots', 'integer', default=lambda r:
db.trip_type(r.trip_type_id)['total_slots']),

在本地,这会导致错误:

TypeError: <lambda>() takes exactly 1 argument (0 given) 

在我的服务器(Linode)上没有错误,但是当我尝试创建时一个带有 sqlform 的新行程实例,总槽位字段是预先设置的填充了这个:

<function <lambda> at 0x7f27684b7140> 

我的 lambda 看起来与正常工作的几乎相同表示在 trip_type_id 字段中,但我使用的是表领域的。那是我做错了吗?

最佳答案

如果您使用可调用(例如 lambda)作为字段默认值,我认为它不能接受任何参数。默认值用于预填充表单字段,因此它们不应依赖于记录中的其他字段值。

另一种方法是使用 computed field (尽管默认情况下它们不会出现在 SQLFORM 中)。另一种选择是在表单处理阶段处理分配,可能通过 onvalidation 函数 - 如下所示:

form.accepts(...,onvalidation=lambda form:form.vars.update(
total_slots=form.vars.total_slots or
db.trip_type(form.vars.trip_type_id)['total_slots']))

在上面的代码中,如果提交了total_slots的值,则该值将被保留——否则,将根据提交的trip_type_id的值从trip_type表中提取默认值。

更新:

如注释中所述,如果在表单中包含total_slots字段,则在提交表单时该字段留空,则数据库中将存储空值而不是计算值。为了避免这个问题,您可以为表单指定一个 onvalidation 函数,检查 form.vars.total_slots 是否为空,如果是,则删除 form.vars.total_slots。在这种情况下,由于total_slots不会包含在DB插入中,因此将调用compute函数来填充该值。

如果您想完全避免在表单处理阶段执行任何操作,另一种选择可能是创建 custom validator对于total_slots 字段。 __init__验证器的方法可以将 request.vars 作为参数,以便在提交表单时验证器可以使用记录的提交值。当验证器被调用时(即__call__方法),它可以检查total_slots的值是否为空,如果是,它可以将其替换为通过字段的compute函数计算的值。通过此设置,标准计算函数将处理直接数据库插入,验证器将通过表单处理插入。

请注意,使用验证器方法时,total_slots 的值将根据 request.vars 中的值计算,这些值是验证之前提交的变量的值。在这种情况下,这应该不是问题,但更一般地说,如果任何字段验证器涉及转换,request.vars 中的值将不会与最终插入数据库记录中的值完全匹配。

关于lambda - 在 Web2py 中使用 lambda 作为模型默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7325776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com