2012-01-23 7 views
2

私はGoogleのアプリエンジンイベントモデルを持っています。私はいくつかの日付範囲でイベントを見つける必要があります。それは[15.02.2012、15.03.2012、18.04.2013]である可能性があります。しかし、私が検索しているとき、私は例外を取得します。ListProperty(item_type = datetime.date)をフィルタリングするために 'in'キーワードを使用することはできますか?

Modelクラス:

# exception 
query = db.GqlQuery('SELECT * FROM Event WHERE dates in :dates', dates=dates) 

このコードは例外なく間違った結果である:ここで

class Event(db.Model): 
    title = db.StringProperty() 
    dates = db.ListProperty(item_type=datetime.date) 

dates = [datetime.date.today(), datetime.date.today() + datetime.timedelta(days = 7), datetime.date.today() + datetime.timedelta(days = 14), datetime.date.today() + datetime.timedelta(days = 24)] 

は私のクエリです

# 0 results, it's wrong 
query = db.GqlQuery('SELECT * FROM Event WHERE dates in :dates', dates=[datetime.datetime.now()]) 

作品が、私はに」必要':

query = db.GqlQuery('SELECT * FROM Event WHERE dates = DATE(2012, 1, 23)') 

同じ例外:例外の

query = db.GqlQuery('SELECT * FROM Event WHERE dates in [DATE(2012, 1, 23)]') 

説明:

ERROR 2012-01-23 13:38:28,335 base.py:117] error: code='internal_server_error', message="Unsupported type for property : <type 'datetime.date'>" 
ERROR 2012-01-23 13:38:28,345 base.py:119] Traceback (most recent call last): 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 545, in dispatch 
    return method(*args, **kwargs) 
    File "D:\project\eventinarea\eventinarea\handler\event.py", line 12, in get 
    tags=self.param('tags') 
    File "D:\project\eventinarea\eventinarea\logic\event.py", line 20, in search_events 
    logging.info(query.count()) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\db\__init__.py", line 2059, in count 
    raw_query = self._get_query() 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\db\__init__.py", line 2633, in _get_query 
    self._cursor, self._end_cursor) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\gql\__init__.py", line 326, in Bind 
    query.update(enumerated_query) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 1723, in update 
    self.__setitem__(filter, value) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 1666, in __setitem__ 
    datastore_types.ValidateProperty(' ', value, read_only=True) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore_types.py", line 1480, in ValidateProperty 
    'Unsupported type for property %s: %s' % (name, v.__class__)) 
BadValueError: Unsupported type for property : <type 'datetime.date'> 
+0

。私は本当にパラメータとして日付のリストで 'in'を使用する必要があります –

答えて

3
# 0 results, it's wrong 
query = db.GqlQuery('SELECT * FROM Event WHERE dates in :dates', dates=[datetime.datetime.now()]) 

これは何の結果を生成しない理由は、あなたが(now()に渡していることが含まれ、両方の年/月/日/時/分/秒/マイクロ秒)、エンティティの日付はちょうど日付(年/月/日)です。

次のようなものは、おそらく動作します:

today = datetime.datetime.today() 
today_date = datetime.datetime(year = today.year, month = today.month, day = today.day) 
query = db.GqlQuery('SELECT * FROM Event WHERE dates in :dates', dates = [today_date]) 

私はあなたの元のクエリが失敗した理由のための手がかりは、このだと思う:

BadValueError: Unsupported type for property : <type 'datetime.date'> 

クエリがdatetime.datetimeオブジェクトを期待していますが、渡していますdatetime.dateオブジェクトです。次のような

何かが動作することがあります。それは、コードの唯一の例だ

today = datetime.datetime.today() 
today_date = datetime.datetime(year = today.year, month = today.month, day = today.day) 
dates = [today_date, today_date + datetime.timedelta(days = 7), today_date + datetime.timedelta(days = 14), today_date + datetime.timedelta(days = 24)] 
query = db.GqlQuery('SELECT * FROM Event WHERE dates in :dates', dates = dates) 
+1

GQLは日付が唯一のdatetimeを好きではないので例外です。日付はデータストア内でdatetimeとして表され、時間はすべて0に設定されます。したがって、要求された日付に対応するdatetimeオブジェクトを作成できますが、時間がゼロに設定されている場合は動作します。 –

関連する問題