#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, поэтому этот кодировщик добавляет эту функциональность.