Mi método de vista de Django está a continuación. Quiero pasar place_data como una respuesta de HTTPRequest (dentro de una llamada a getJSON en el lado del cliente, pero eso es irrelevante para el problema).Django Serialización de objetos DateTime en el diccionario
Puedo pasar el diccionario bien hasta que incluya el event_occurrences, que está haciendo un trabajo entre bastidores para pasar un diccionario de eventos con horas de inicio y fin.
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')
Aquí está el código tratando de hacer la serialización del diccionario event_occurrences:
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
la llamada a event.upcoming_occurrences referencia a la función a continuación:
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
Este me está dando el siguiente error:
Exception Type: AttributeError
Exception Value: 'dict' object has no attribute '_meta'
que se dan cuenta de que no puedo acaba de llamar json.dumps() en mis event_occurrences objeto, pero no puede encontrar la manera de conseguir alrededor de este error de serialización (y esta es la primera vez que trabaja con la serialización en Python) . ¿Podría alguien darme alguna orientación sobre cómo y dónde se debe llevar a cabo la serialización?
Gracias de antemano!
ACTUALIZACIÓN: Se ha añadido la función de llamadas para ayudar con la claridad de que se trate. Por favor mira arriba.
Confused. ¿Cómo se relaciona el código 'json_serializer' con la función anterior? ¿Dónde se llama? ¿Por qué no puedes simplemente usar 'json.dumps' en ese diccionario también? ¿Y por qué no has aceptado una respuesta para una sola pregunta que has hecho? –