我遇到了问题,但我找不到任何有关的信息。
我在我的模型中定义了一个像这样的字段。
class Dates(ndb.model):
...
date = ndb.DateTimeProperty(required = True) # I want to store date and time
...
后来我尝试了一个查询(现在我想要一天的所有日期,我不介意时间):
kl = Dates.query(ndb.AND(Dates.date.year == year,
Dates.date.month == month,
Dates.date.day == day),
ancestor = customer.key).fetch(keys_only = True)
dates = ndb.get_multi(kl)
但我收到此错误日志: AttributeError:'DateTimeProperty'对象没有属性'year'
我不知道为什么。我试过Dates.date()== date,Dates.date == date(< -DateTime obj),...
我的数据库仍然是空的,但我想这并不介意,因为我永远不会在每个可能的日子都有日期。
有人知道为什么吗?我应该改用GQL吗?
答案 0 :(得分:16)
您可以使用“范围”查询。见下面的例子。
import datetime
date = datetime.datetime.strptime('02/19/2013', '%m/%d/%Y')
kl = Dates.query(
ndb.AND(Dates.date >= date),
Dates.date < date + datetime.timedelta(days=1))
将于02/19/2013获取所有日期时间。
答案 1 :(得分:7)
你想要实现的目标实际上是不可能的,因为你只能查询整个日期,而不能查询它的某些部分。
为了实现您的目标,我建议您为模型添加更多属性:
class Dates(ndb.model):
...
date = ndb.DateTimeProperty(requiered=True)
date_year = ndb.IntegerProperty()
date_month = ndb.IntegerProperty()
date_day = ndb.IntegerProperty()
...
您可以在每次保存时更新这些值,也可以使用Model Hooks自动执行此操作,然后您的新查询将变为:
kl = Dates.query(ndb.AND(Dates.date_year == year,
Dates.date_month == month,
Dates.date_day == day),
ancestor=customer.key).fetch(keys_only=True)
dates = ndb.get_multi(kl)
答案 2 :(得分:2)
使用DateProperty。然后你可以使用一个简单的==查询:
>>> import datetime
>>> from google.appengine.ext.ndb import *
>>> class D(Model):
... d = DateProperty()
...
>>> d = D(d=datetime.date.today())
>>> d.put()
Key('D', 9)
>>> d
D(key=Key('D', 9), d=datetime.date(2013, 2, 20))
>>> D.query(D.d == datetime.date.today()).fetch()
[D(key=Key('D', 9), d=datetime.date(2013, 2, 20))]
答案 3 :(得分:1)
我将@Guido van Rossum代码段扩展为包含&lt;&gt;和timedelta进行计算,主要是为了我自己的满意度
import datetime
from datetime import timedelta
from google.appengine.ext.ndb import *
class D(Model):
d = DateProperty()
now = datetime.date.today()
date1 = now-timedelta(+500)
date2 = now-timedelta(+5)
d1 = D(d=now)
d2 = D(d=date1)
d3 = D(d=date2)
d1.put()
d2.put()
d3.put()
date2 = now-timedelta(+50)
result1 = D.query(D.d == now).fetch(4)
result2 = D.query(D.d > date2).fetch(2)
result3 = D.query(D.d < date2).fetch(2)
result4 = D.query(D.d >= date2, D.d <= now).fetch(2)
print result1
print "+++++++"
print result2
print "+++++++"
print result3
print "+++++++"
print result4