代码之家  ›  专栏  ›  技术社区  ›  Oscar Parra

日期时间字段出现ndb查询错误-谷歌应用程序引擎

  •  11
  • Oscar Parra  · 技术社区  · 12 年前

    我遇到了一个问题,我找不到关于的任何信息。

    我在模型中定义了一个字段,如下所示。

    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()==日期,Dates.date==日期(<-DateTime对象)。。。

    我的数据库仍然是空的,但我想这并不介意,因为我永远不会每一天都有约会。

    有人知道为什么吗?我应该改用GQL吗?

    4 回复  |  直到 12 年前
        1
  •  17
  •   Dmytro Sadovnychyi    12 年前

    您可以为此使用“范围”查询。请参阅下面的示例。

    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))
    

    将于2013年2月19日获取所有日期时间。

        2
  •  7
  •   Lipis    12 年前

    您试图实现的目标实际上是不可能的,因为您只能查询整个日期,而不能查询其中的某些部分。

    为了实现您正在尝试的效果,我建议您在模型中再添加一些属性:

    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)
    
        3
  •  2
  •   Guido van Rossum    12 年前

    使用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))]
    
        4
  •  1
  •   user784435 user784435    12 年前

    我扩展了@Guido van Rossum的代码片段,包括<>和计算的时间增量,主要是为了我自己的满意

    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