Можно ли использовать ключевое слово «in» для фильтрации по ListProperty (item_type = datetime.date)? - PullRequest
2 голосов
/ 23 января 2012

У меня есть google app engine Модель событий.Мне нужно найти события в некотором диапазоне дат.Это может быть [15.02.2012, 15.03.2012, 18.04.2013].Но когда я ищу, я получаю исключение.

Класс модели:

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

Вот мой запрос:

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

Этот код без исключения, но с неправильнымрезультаты:

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

Работает, но мне нужно 'in':

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

1 Ответ

3 голосов
/ 24 января 2012
# 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...