Как мне передать объект JSON в FullCalendar из Django (путем сериализации модели)?

#django #json #events #serialization #fullcalendar

#django #json #Мероприятия #сериализация #полный календарь

Вопрос:

FullCalendar поддерживает получение объекта JSON через AJAX для его событий, это может быть сделано при инициализации или позже, вот так:

 $('#calendar').fullCalendar('addEventSource', "/{{ user }}/events/" );
  

Сама сериализация в моем представлении Django выглядит следующим образом:

 ...
events = Event.objects.filter(user=request.user, start__gte=start, end__lte=end)
message = serializers.serialize("json", events, ensure_ascii=False)
...
  

Возвращаемый объект JSON выглядит следующим образом:

 [{"pk": 2, "model": "main.event", "fields": {"url": null, "start": "2010-10-09 08:30:00", "end": "2010-10-09 10:30:00", "user": 1, "title": "sdf"}}, {"pk": 3, "model": "main.event", "fields": {"url": null, "start": "2010-10-03 08:30:00", "end": "2010-10-03 12:00:00", "user": 1, "title": "sdf2"}}]
  

Событие Fullcalendar принимает следующие переменные: id, title, start, end, AllDay и url.

Я думаю, что FullCalendar получает мой объект JSON прямо сейчас (не уверен, как проверить), но это, вероятно, неприемлемо, как я могу сделать это приемлемым для FullCalendar? Вероятно, это тоже выглядит примерно так:

 [{id: 1, title: 'Title1', start: new Date(2010, 10, 3, 8, 30), end: new Date(2010, 10, 3, 12, 0), allDay: false, url: false}]
  

или:

 [{"id": 1, "title": 'Title1', "start": new Date(2010, 10, 3, 8, 30), "end": new Date(2010, 10, 3, 12, 0), "allDay": false, "url": false}]
  

Или даже что-то еще, не уверен.

Итак, в основном ситуация такова, что я раньше не работал с объектами JSON, и я не уверен, как лучше всего сериализовать модель в приемлемый объект JSON, есть идеи?

Ответ №1:

Не используйте для этого встроенные сериализаторы Django. Я почти никогда ими не пользуюсь — они очень негибкие.

К счастью, сериализовать содержимое самостоятельно очень просто.

 from django.utils import simplejson
from django.core.serializers.json import DjangoJSONEncoder

events = Event.objects.filter(
              user=request.user, start__gte=start, end__lte=end
         ).values('id', 'title', 'start', 'end')
data = simplejson.dumps(list(events), cls=DjangoJSONEncoder)
  

Здесь я просто получаю словарь из набора запросов через values и передаю его simplejson для кодирования списка полей select. Мне нужно использовать DjangoJSONEncoder поскольку по умолчанию json не знает о datetimes, поэтому этот кодировщик добавляет эту функциональность.