Django models are not ajax serializable

ajax, django, django-models, django-views, json

Solution

You just need to add, in your `.dumps` call, a `default=encode_myway` argument to let `simplejson` know what to do when you pass it data whose types it does not know -- the answer to your "why" question is of course that you haven't told poor `simplejson` what to DO with one of your models' instances.

And of course you need to write `encode_myway` to provide JSON-encodable data, e.g.:

def encode_myway(obj):
  if isinstance(obj, User):
    return [obj.username,
            obj.firstname,
            obj.lastname,
            obj.email]
    # and/or whatever else
  elif isinstance(obj, OtherModel):
    return [] # whatever
  elif ...
  else:
    raise TypeError(repr(obj) + " is not JSON serializable")

Basically, JSON knows about VERY elementary data types (strings, ints and floats, grouped into dicts and lists) -- it's YOUR responsibility as an application programmer to match everything else into/from such elementary data types, and in `simplejson` that's typically done through a function passed to `default=` at `dump` or `dumps` time.

Alternatively, you can use the `json` serializer that's part of Django, see the docs.

Problem

I have a simple view that I'm using to experiment with AJAX. ``` def get_shifts_for_day(request,year,month,day): data= dict() data['d'] =year data['e'] = month data['x'] = User.objects.all()[2] return HttpResponse(simplejson.dumps(data), mimetype='application/javascript') ``` This returns the following: ``` TypeError at /sched/shifts/2009/11/9/ <User: someguy> is not JSON serializable ``` If I take out the data['x'] line so that I'm not referencing any models it works and returns this: ``` {"e": "11", "d": "2009"} ``` Why can't simplejson parse my one of the default django models? I get the same behavior with any model I use.

Original source