2011-01-15 15 views
7

Moja metoda widoku Django znajduje się poniżej. Chcę przekazać place_data jako odpowiedź z HTTPRequest (w ramach wywołania getJSON po stronie klienta, ale to nie ma znaczenia dla problemu).Django Serializacja obiektów DateTime w słowniku

mogę przekazać słownika grzywny, dopóki nie obejmują event_occurrences, co robi pewne prace za kulisami przekazać słownika zdarzeń z czasem rozpoczęcia i zakończenia.

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') 

Oto kod próbuje zrobić szeregowanie słownika 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 

wywołanie event.upcoming_occurrences referencje funkcji poniżej:

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 

To daje mi następujący błąd:

Exception Type: AttributeError 
Exception Value: 'dict' object has no attribute '_meta' 

Zdaję sobie sprawę, że nie można po prostu zadzwonić json.dumps() na moich event_occurrences obiekt, ale nie można dowiedzieć się, jak obejść ten problem serializacji (i to jest mój pierwszy raz współpracuje z serializacji w Pythonie) . Czy ktoś mógłby podać mi jakiś kierunek, w jaki sposób i gdzie musi nastąpić serializacja?

Z góry dziękuję!

UPDATE: Dodano funkcję wzywa do pomocy przy jasności pytanie. Zobacz powyżej.

+0

Zmieszany. W jaki sposób ten kod 'json_serializer' odnosi się do powyższej funkcji? Gdzie się nazywa? Dlaczego nie możesz po prostu użyć 'json.dumps' w tym słowniku? I dlaczego nie zaakceptowałeś odpowiedzi na jedno pytanie, które zadałeś? –

Odpowiedz

29

Ramy serializacji Django są dla QuerySets, a nie dla dyktowania. Jeśli chcesz po prostu zrzucić słownik do JSON, po prostu użyj json.dumps. Można go łatwo przekształcić do serializacji obiektów, przekazując niestandardową klasę serializacji - jest dostępna w Django, która zajmuje się już datami:

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

Wahoo! Dzięki, Daniel. Właśnie tego szukałem - Ah, Django zawsze sprawia, że ​​rzeczy są takie proste. – user546459

+0

Dzięki, właśnie taka była odpowiedź, której szukałem! – stricjux

Powiązane problemy