TypeError: невозможно сравнить datetime.date с DateProperty

Я пытаюсь запросить, принадлежит ли определенная дата к определенному диапазону дат. Пример исходного кода:

billing_period_found = BillingPeriod.query(
        ndb.AND(
            transaction.date > BillingPeriod.start_date,
            transaction.date < BillingPeriod.end_date)
        ).get()

Определение данных:

class Transaction(ndb.Model):
    date = ndb.DateProperty(required=False)

class BillingPeriod(ndb.Model):
    start_date = ndb.DateProperty(required=False)
    end_date = ndb.DateProperty(required=False)

Получение следующей ошибки: TypeError: не удается сравнить datetime.date с DateProperty

Ошибка сообщения имеет смысл, поскольку datetime отличается от DateProperty. Однако, как вы можете видеть, определение для transaction.date не является datetime, поэтому я не понимаю, откуда исходит эта попытка преобразовать datetime в date. В любом случае, если я выясню, как преобразовать datetime в DateProperty, я думаю, это решит проблему.

Любые идеи о том, как решить эту проблему?

Спасибо!


person Fabio Moggi    schedule 28.11.2015    source источник


Ответы (1)


Хранилище данных App Engine не допускает запросов с неравенством для нескольких свойств (не ограничение ndb, а ограничение базового хранилища данных). Выбор сущностей диапазона дат, содержащих определенную дату, является типичным примером задач, которые невозможно выполнить в одном запросе.

Ознакомьтесь с Оптимизация запроса неравенства в ndb по двум свойствам для примера этого вопроса и, в ответ, одного предложения, которое может сработать: запросите (в вашем случае) все BillingPeriod сущности с end_date больше, чем желаемая дата, возможно, с проекцией, чтобы просто получить их ключ и start_date; затем выберите из них только те, у которых start_date меньше желаемой даты, в вашем собственном приложении (если вам нужен только один из них, то next над итератором остановится, как только он его найдет).

Изменить: указанная выше проблема является проблемой №1 с этим кодом; после решения возникает проблема № 2, как четко указано на https://cloud.google.com/appengine/docs/python/ndb/queries свойство ndb запросов всегда находится слева от оператора сравнения. Таким образом, нельзя выполнить date < BillingPeriod.end_date, так как это имело бы свойство справа; скорее, один делает BillingPeriod.end_date > date.

person Alex Martelli    schedule 29.11.2015
comment
Спасибо за ответ, Алекс. Я все еще получаю ту же ошибку после удаления условия AND. Я думаю, что проблема больше связана с тем, что gae пытается преобразовать datetime в dateproperty. Для меня это не имеет особого смысла, потому что все сравнения основаны на значениях DateProperty, поступающих из хранилища данных: billing_period_found = BillingPeriod.query( date ‹ BillingPeriod.end_date ).get() - person Fabio Moggi; 29.11.2015
comment
@FabioMoggi, посмотрите на cloud.google.com/appengine/docs/python/ndb. /queries, и я цитирую: NDB поддерживает следующие операции: свойство == значение, свойство ‹ значение и т. д.; обратите внимание, что свойство всегда находится слева от оператора сравнения. Таким образом, вы не можете сделать date < BillingPeriod.end_date, так как это свойство было бы справа right; скорее, просто сделайте BillingPeriod.end_date > date. Верну это и в мой ответ для полноты картины. - person Alex Martelli; 29.11.2015
comment
Фантастический! На этот раз это сработало. Извините за невнимательность и спасибо за подробное объяснение. - person Fabio Moggi; 29.11.2015
comment
Ma prego @FabioMoggi, моя благодарность за то, что я не заметил проблему № 2 в начале и, таким образом, дал полный ответ с самого начала. - person Alex Martelli; 29.11.2015