如何使用field-id计算数据库字段

时间:2015-07-29 15:59:47

标签: python web2py

型号:

db.define_table('orders',
    Field('customer_id', db.customer)
    Field('order_id', 'string')
    )

我希望得到一个特殊的order_id,例如XY-150012,其中XY是客户名称的一部分,15是年份,12orders的实际记录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

SOLUTION:

通过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))

1 个答案:

答案 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