如何为ndb.TimeProperty()指定默认时间?

时间:2016-05-19 12:08:08

标签: python google-app-engine

我发现自己陷入了这个问题,并重复谷歌搜索,检查SO,阅读大量的文档并没有帮助我得到正确的答案,所以我希望这不是一个糟糕的问题。

我想要创建的一个实体是在会议期间发生的事件。我给它了属性start_time = ndb.TimeProperty()。我还有一个属性date = messages.DateProperty(),我想保持两个离散(换句话说,不使用DateTimeProperty)。

当用户输入信息以创建活动时,我想为他们在创建时未输入的任何字段指定默认值,并且我想将默认时间设置为午夜,但我似乎无法理解正确格式化,以便服务接受它(当我使用API​​资源管理器尝试时,持续 503服务不可用响应)。

现在我已经设置了这样的东西(删除了一些不必要的细节):

event_defaults = {...
    ...
    "start_time": 0000,
    ...
    }

然后我尝试循环我的默认值,将它们输入到我将用于.put()服务器上的信息的字典中。

data = {field.name: getattr(request, field.name) for field in request.all_fields()

for default in event_defaults:
    if data[default] in (None, []):
        data[default] = event_defaults[default]
        setattr(request, default, event_defaults[default])

在日志中,我看到错误来自ProtoRPC方法实现的遇到意外错误:BadValueError(预期时间,得到0)。我也尝试使用timedatetime模块,但我必须错误地使用它们,因为我仍然会收到错误。

我想我可以通过使用ndb.StringProperty()来解决这个问题,而只是处理字符串,但是我觉得我错过了一个机会来了解更多GAE NDB 1}}和conference.py工作(所有这些都是针对udacity.com上的项目,所以学习肯定是重点)。

那么,我怎样才能在午夜正确构建默认时间?对不起文字墙。

链接到github上的代码。 models.py文件包含我遇到问题的代码,而TimeProperty()包含我与我合作的实体的定义。

更新:我是个假人。我使用StringField()创建了我的模型类,使用WHILE创建了相应的消息类,但我从未在预期类型之间进行正确的转换。这就是为什么我似乎永远不会给它正确的东西,但它在代码的不同点预期两个不同的东西。问题已解决。

2 个答案:

答案 0 :(得分:1)

TimeProperty需要datetime.time值

import datetime

event_defaults = {...
    ...
    "start_time": datetime.time(),
    ...
    }

文档中的更多信息:https://cloud.google.com/appengine/docs/python/ndb/entity-property-reference#Date_and_Time

答案 1 :(得分:0)

使用datetime()库将其转换为有效的ndb时间属性值

    if data['time']:
        data['time'] = datetime.strptime(data['time'][:10], "%H:%M").time()
    else:
        data['time'] = datetime.datetime.now().time()

ps:不要忘记使用您的字段名称更改数据['时间']