>
> I'm actually taking 2 values from the request as the query (q = mytable.x
> == request.vars.X and mytable.y == request.vars.Y)
> [X is actually not from the vars, but from the env's].
> update_or_insert() takes care of making these more or less unique. The
> downside of that is only knowing the id if the insert takes place, so I can
> tell if it was an update but not where. Doing a second query is possible,
> I admit.
>
If you need to do an update-or-insert but need the ID in case of update,
then do not use .update_or_insert -- just write your own logic, as it is
quite simple.
> a _before_update hook gives me the id, but how do I add the num_updates
> field? lambda s, f: f.append(dict('num_updates', 2)) doesn't work (gives
> an AttributeError). The ticket says f is really an OpRow, and anyway I
> don't want to stick a dict *into* it. Python dict's have an update
> method to, um, concatenate a dict to a dict; does OpRow have something
> like that? And how can I get the present value?
>
The second argument passed to _before_update is a Row-like object of the
fieldnames/values of the update -- so just do this:
def mytable_before_update(s, f):
# f['num_updates'] also works.
f.num_updates = db.mytable.num_updates + 1
With a lambda, you can do:
lambda s, f: f.set_value('num_updates', db.mytable.num_updates + 1)
Though the .set_value method is not part of the public API, so may not
remain backward compatible.
Note, you do not need the current value of num_updates -- if you use an
expression like above, the database will do the addition for you. To see
what the generated query looks like, try printing db(db.mytable.id ==
some_id)._update(num_updates=db.mytable.num_updates + 1).
Anthony
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.