【问题标题】:TypeError: can't compare datetime.date to DatePropertyTypeError:无法将 datetime.date 与 DateProperty 进行比较
【发布时间】:2015-11-28 23:15:25
【问题描述】:

我正在尝试查询某个日期是否属于特定日期范围。源代码示例:

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 转换为 DateProperty,我想它会解决问题。

关于如何解决这个问题的任何想法?

谢谢!

【问题讨论】:

    标签: google-app-engine google-cloud-datastore app-engine-ndb python-datetime


    【解决方案1】:

    App Engine 数据存储区不允许对多个属性进行不等式查询(不是ndb 的限制,而是基础数据存储区的限制)。选择包含特定日期的日期范围实体是一个典型的任务示例,这使得在单个查询中无法实现。

    查看Optimizing a inequality query in ndb over two properties 以获取此问题的示例,并在答案中提出一个可能有效的建议:查询(在您的情况下)所有end_date 大于所需日期的BillingPeriod 实体,也许投影只是得到他们的钥匙和start_date;然后,在您自己的应用程序中从那些start_date 小于所需日期的那些中选择(如果您只想要其中一个,那么迭代器上的next 将在找到一个后立即停止)。

    编辑:上面的问题是这段代码的问题#1;一旦解决,问题 #2 就出现了——正如https://cloud.google.com/appengine/docs/python/ndb/queries 中明确列出的那样,属性是ndb 查询总是在比较运算符的left 上。所以,不能做date &lt; BillingPeriod.end_date,因为那会在 right 上有属性;而是BillingPeriod.end_date &gt; date

    【讨论】:

    • 谢谢你的回答,亚历克斯。删除 AND 条件后,我仍然遇到相同的错误。我认为这个问题更多地与 gae 试图将 datetime 转换为 dateproperty 的事实有关。这对我来说真的没有意义,因为所有比较都基于来自数据存储的 DateProperty 值: billing_period_found = BillingPeriod.query( date
    • @FabioMoggi,看看cloud.google.com/appengine/docs/python/ndb/queries,我引用:“NDB 支持这些操作:property == value, property left 上。所以你不能做date &lt; BillingPeriod.end_date,因为那会在right上有属性;相反,只需执行BillingPeriod.end_date &gt; date。为了完整起见,也将其备份在我的答案中。
    • 太棒了!这次确实奏效了。很抱歉没有引起注意,感谢您的详细解释。
    • Ma prego @FabioMoggi,我轮到我了,因为在开始时没有发现问题 #2,因此从一开始就给出了完整的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多