2011-01-15 21 views
7

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.

+0

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? –

Respuesta

29

El marco de serialización de Django es para QuerySets, no para los dictados. Si desea simplemente volcar un diccionario en JSON, solo use json.dumps. Se puede hacer fácilmente serializar objetos pasando una clase de serialización personalizada; hay uno incluido con Django que ya se ocupa de las fechas:

from django.core.serializers.json import DjangoJSONEncoder 
json.dumps(mydict, cls=DjangoJSONEncoder) 
+0

Wahoo! Gracias Daniel. Esto era exactamente lo que estaba buscando. Ah, Django siempre hace las cosas tan simples. – user546459

+0

¡Gracias, fue exactamente la respuesta que estaba buscando! – stricjux

Cuestiones relacionadas