New to python and Pyramid.
I have a view that does pagination. How do I json encode it? I get an error “object at 0x2d16d90> is not JSON serializable” when I try this:
@view_config(route_name="paginate")
def paginate(request):
query = DBSession.query(MyTable)
page_url = paginate.PageURL_WebOb(request)
customers = paginate.Page(query,
page=int(request.params.get("page", 1)),
items_per_page=25,
url=page_url)
if "partial" in request.params:
# Render the partial list page
return render_to_response("templates/my_json.jinja2",
{"customers": json.dumps(customers)},
request=request)
else:
# Render the full list page
return render_to_response("templates/my.jinja2",
{"customers": customers},
request=request)
JSON is a strict textual format. You cannot just throw SQLAlchemy at the encoder and expect this to Just Work, you need to decide what the encoding for your objects will look like.
One way is for your SQLAlchemy objects to implement an extra method that returns a simple python dictionary; one that can be serialized. That means it can only use strings for keys, and can only contain lists, tuples, numbers and / or strings.
An example method could be:
This returns a dictionary with
nameandphonekeys, where thephonekey contains a list of phone numbers from a (purely made up for example purposes) phonenumbers relationship.You can then use that information to create a new list of dictionaries that
json.dumpscan handle:The upcoming Pyramid 1.4 adds specific support for serializing custom objects in the
jsonrenderer via the__json__method hook, as well as support for adapters to do the conversion for you.