在Web2py中,您可以将lambda分配给数据库Field以将其表示为文本:
Field('duetime', 'time', represent=lambda t,r: t.strftime("%H:%M") if t else '')
通过生成SQLForm时的这种描述,您将得到很好的时间表示(不会显示秒数)。
但是当我想在纯HTML视图中使用数据表示时,我只得到原始数据:
for r in rows: print "Repr: %s Str: %s" % (r.duetime.repr(),r.duetime.str())
Repr: datetime.time(16, 15) Str: 16:15:00
Repr: None Str: None
所以看起来只有SQLForm在内部生成字段表示。
如何获取包含数据表示而不是原始数据的查询结果集(行)?
答案 0 :(得分:2)
您可以使用Rows.render
方法。对于单个记录:
rows = db(query).select()
rendered_row = rows.render(0) # apply "represent" functions to the first row
print rendered_row.duetime
为了提高效率,您可以限制"代表哪些字段"将应用函数:
rendered_row = rows.render(0, fields=[db.mytable.duetime])
如果你没有将索引作为.render()
的第一个参数传递,它会返回一个生成器,允许你遍历所有行:
for row in rows.render():
print row.duetime
如果要循环遍历行的子集,请创建子集并在子集上调用.render()
:
for row in rows[0:10].render():
print row.duetime
book中的详细信息。
答案 1 :(得分:0)
好吧,我写了一个小函数,它将Rows和Table作为参数并返回字典列表,其中键是字段,值是它们的表示(几乎像行):
def get_rows_representation(rows,table):
return [{f: table[f].represent(r[f],r) if table[f].represent else r[f] for f in r.as_dict()} for r in rows]
但也许有更好的原生方式直接从Rows获得Field表示?