【问题标题】:Descriptor 'date' requires a 'datetime.datetime' object but received a 'unicode'描述符 'date' 需要一个 'datetime.datetime' 对象,但收到了一个 'unicode'
【发布时间】:2012-06-07 13:43:57
【问题描述】:

我正在使用活塞为我正在编写的用于处理重复日历事件的应用程序编写 JSON api。

我的 API 正在处理常规事件,当我尝试添加逻辑来处理重复事件时,我开始收到以下错误:

描述符 'date' 需要一个 'datetime.datetime' 对象,但收到了一个 '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 方法。

【问题讨论】:

    标签: python django django-piston


    【解决方案1】:

    通过使用from datetime import datetime, timedelta,您已经从 datetime 模块导入了 datetime 类型。因此,当您调用 datetime.date 时,您正在调用 datetime 类型的方法。

    我认为你想要的是使用 datetime 模块中的日期类型:

    1. 将您的导入更改为from datetime import datetime, timedelta, date。
    2. 请致电date(year, month, 1) 而不是datetime.date(year, month, 1)。

    【讨论】:

    • 糟糕,我忘了提及您需要更改的其他部分。请参阅我编辑的答案。
    • 现在它告诉我需要一个整数。我尝试了将 datetime.date 更改为仅日期的各种组合,似乎第一个调用(在过滤器中)是正在更改错误消息的调用。更改其他两个(到目前为止)没有效果。
    • 你的变量年月的内容是什么?
    • 2012 年和 5 年。 uid 为 1。
    • 你确定它们是整数而不是字符串?如果您从 URL 获取它们,它们可能会作为字符串数据传递。如果是这样,您可能需要使用例如 int(year) 进行转换。
    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2015-12-23
    • 1970-01-01
    相关资源
    最近更新 更多