型号:
db.define_table('orders',
Field('customer_id', db.customer)
Field('order_id', 'string')
)
我希望得到一个特殊的order_id
,例如XY-150012
,其中XY
是客户名称的一部分,15
是年份,12
是orders
的实际记录ID。我试过模型:
db.orders.order_id.compute = lambda r: "%s-%s00%s" % (db.customer(r['customer_id']).short, str(request.now.year)[2:], r['id'])
永远不会识别id
,计算结果为None
。如果我从计算行中删除它r['id']
。
在模型中添加额外字段field('running_number', 'integer')
后,我可以访问此字段内容。
有没有简单的方法来设置这个字段default=db.orders.id
?
通过Anthony的输入,并阅读recursive selects我想出了这个解决方案:
db.define_table('orders',
Field('customer_id', db.customer),
Field('order_id', 'string', default = None))
def get_order_id(id, short):
y = str(request.now.year)[2:]
return '%s-%s00%s' % (short, y, id)
def set_id_after_insert(fields,id):
fields.update(id=id)
def set_order_id_after_update(s,f):
row = s.select().first()
if row['order_id'] == None:
s.update_naive(order_id=get_order_id(row['id'], row['customer_id'].short)
else:
return
db.orders._after_insert.append(lambda f,id: set_id_after_insert(f,id))
db.orders._after_update.append(lambda s,f: set_order_id_after_update(s,f))
答案 0 :(得分:1)
问题是记录ID在数据库中插入记录后才知道,因为id
字段是一个自动递增的整数字段,其值由数据库生成,而不是由web2py生成
一种选择是定义_after_insert
callback,在插入后更新order_id
字段:
def order_after_insert(fields, id):
fields.update(id=id)
db(db.order.id == id).update(order_id=db.order.order_id.compute(fields))
db.order._after_insert.append(order_after_insert)
您可能还想创建一个_after_update
回调,但在这种情况下,请确保在定义{{1}时在两个回调中使用update_naive
参数}(详见上文链接)。
根据Set
的使用方式,其他选项可能是virtual field。