11

問題が発生しましたが、情報が見つかりません。

モデルにこのようにフィールドを定義します。

class Dates(ndb.model):
    ...
    date = ndb.DateTimeProperty(required = True) # I want to store date and time
    ...

後でクエリを試します(今は1日のすべての日付が必要ですが、時間は気にしません):

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)、..を試しました。

私のDBはまだ空ですが、可能なすべての日の日付がないので、これは問題ではないと思います。

誰もが理由を知っていますか?代わりにGQLを使用する必要がありますか?

4

4 に答える 4

17

これには「範囲」クエリを使用できます。以下の例を参照してください。

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 日のすべての日時を取得します。

于 2013-02-19T17:24:21.993 に答える
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)
于 2013-02-19T11:28:34.510 に答える
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))]
于 2013-02-20T15:22:06.210 に答える
1

@Guido van Rossum のコード スニペットを拡張して <> と計算用の 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
于 2013-03-03T10:01:54.573 に答える