My Django view method is given below. I want to pass place_data as a response from HTTPRequest (in the getJSON call on the client side, but this is not related to the problem).
I can pass on the vocabulary until I turn on event_occurrences , which does some work behind the scenes to transmit the vocabulary of events with start and end time.
def mobile_place_detail(request,place_id): callback = request.GET.get('callback', 'callback') place = get_object_or_404(Place, pk=place_id) event_occurrences = place.events_this_week() place_data = { 'Name': place.name, 'Street': place.street, 'City': place.city, 'State': place.state, 'Zip': place.zip, 'Telephone': place.telephone, 'Lat':place.lat, 'Long':place.long, 'Events': event_occurrences, } xml_bytes = json.dumps(place_data) if callback: xml_bytes = '%s(%s)' % (callback, xml_bytes) print xml_bytes return HttpResponse(xml_bytes, content_type='application/javascript; charset=utf-8')
Here is the code that is trying to serialize the event_occurrences dictionary:
def events_this_week(self): return self.events_this_week_from_datetime( datetime.datetime.now() ) def events_this_week_from_datetime(self, now): event_occurrences = [] for event in self.event_set.all(): event_occurrences.extend(event.upcoming_occurrences()) event_occurrences.sort(key=itemgetter('Start Time')) counter = 0 while counter < len(event_occurrences) and event_occurrences[0]['Start Time'].weekday() < now.weekday(): top = event_occurrences.pop(0) event_occurrences.insert(len(event_occurrences), top) counter += 1 json_serializer = serializers.get_serializer("json")() return json_serializer.serialize(event_occurrences, ensure_ascii=False) return event_occurrences
The following function is provided in the event.upcoming_occurrences call:
def upcoming_occurrences(self): event_occurrences = [] monday_time = datetime.datetime.combine(datetime.date.today() + relativedelta(weekday=MO), self.start_time) all_times = list(rrule(DAILY, count=7, dtstart=monday_time)) weekday_names = ('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday') for idx, weekday in enumerate(weekday_names): if getattr(self, weekday): event_occurrences.append({ 'Name': self.name, 'Start Time': all_times[idx], 'End Time': all_times[idx] + datetime.timedelta(minutes=self.duration) }) return event_occurrences
This gives me the following error:
Exception Type: AttributeError Exception Value: 'dict' object has no attribute '_meta'
I understand that I cannot just call json.dumps () for my event_occurrences object, but I cannot figure out how to get around this serialization error (and this is my first work with serialization in Python). Can someone please give me some direction on how and where serialization should be performed?
Thanks in advance!
UPDATE: function calls have been added to help with clarity. See above.