2012-06-02 2 views
2

Я использую поршень для записи JSON api для приложения, которое я пишу, которое обрабатывает повторяющиеся события календаря.Дескриптору 'date' требуется объект 'datetime.datetime', но получил 'unicode'

Мой API работает для регулярных событий, когда я попытался добавить логику для обработки повторения, я начал получать следующее сообщение об ошибке:

descriptor 'date' requires a 'datetime.datetime' object but received a 'unicode'

Вот мой handlers.py:

from piston.handler import BaseHandler 
from lessons.models import NewEvent, EachEvent 
import calendar 
from datetime import datetime, timedelta 

class CalendarHandler(BaseHandler): 
allowed_methods = ('GET',) 
model = EachEvent 
fields = ('actualDate', ('manager', ('firstName', 'lastName'))) 

def next_date(startDate, recurrence, rangeStart): 
    sd = startDate 
    while (sd < rangeStart): 
     print sd; 
     sd += datetime.timedelta(recurrence) 
    return sd 

def read(self, request, uid, month, year): 
    qs = NewEvent.objects.filter(manager__boss = request.user).filter(endDate__gte=datetime.date(year, month, 1)).filter(startDate__lte=datetime.date(year, month, calendar.mdays[month])) 
    lessonList = [] 
    qsList = list(qs) 
    for l in qsList: 
     if l.frequency == 0: 
      x = EachLesson() 
      x.lessonID = l.id 
      x.actualDate = l.startDate 
      x.manager = l.manager 
      lessonList.append(x) 
     else: 
      sd = next_date(l.startDate, l.frequency, datetime.date(year, month, 1)) 
      while (sd <= datetime.date(year, month, calendar.mdays[month])): 
       x = EachLesson() 
       x.lessonID = l.id 
       x.actualDate = sd 
       x.manager = l.manager 
       lessonList.append(x) 
       sd += datetime.timedelta(recurrence) 

    return lessonList 

frequency является IntegerField, actualDate, startDate и endDate - все DateField.

Мой URLconf принимает uid, год и месяц, все из которых передаются в качестве параметров для метода CalendarHandler.read.

ответ

7

С помощью from datetime import datetime, timedelta вы импортировали тип datetime из модуля datetime. Таким образом, при вызове datetime.date вы вызываете метод типа datetime.

Я думаю, что вы хотите использовать тип даты из модуля даты и времени:

  1. Изменить свой импорт в from datetime import datetime, timedelta, date.
  2. Звоните date(year, month, 1) вместо datetime.date(year, month, 1).
+0

К сожалению, я забыл упомянуть другую часть того, что вам нужно изменить. См. Мой отредактированный ответ. – BrenBarn

+0

Теперь это говорит мне, что требуется целое число. Я пробовал различные комбинации изменения datetime.date до даты, и кажется, что первым вызовом (в фильтре) является тот, который меняет сообщение об ошибке. Изменение двух других (пока) не влияет. –

+0

Какое содержимое ваших переменных год и месяц? – BrenBarn