我正在尝试查询某个日期是否属于特定的日期范围。源代码示例:
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,我想它会解决这个问题。
关于如何解决这个问题的任何想法?
谢谢!
答案 0 :(得分:3)
App Engine数据存储区不允许在多个属性上使用不等式的查询(不是ndb
的限制,而是基础数据存储区的限制)。选择包含特定日期的日期范围实体是一个典型的任务示例,这使得无法在单个查询中实现。
查看Optimizing a inequality query in ndb over two properties以获取此问题的示例,并在答案中提供一条可行的建议:查询(在您的情况下)所有BillingPeriod
个实体end_date
更高的实体比期望的日期,也许只是投射得到他们的关键和start_date
;然后,在你自己的应用程序中选择那些只有start_date
小于所需日期的那些(如果你只想要其中一个,那么迭代器上的next
将在它找到后立即停止一个)。
修改:上述问题是此代码的问题#1;一旦解决,问题#2就会出现 - 如https://cloud.google.com/appengine/docs/python/ndb/queries清楚列出的那样,属性为ndb
查询始终位于比较运算符的 left 上。所以,一个人不能date < BillingPeriod.end_date
,因为右边的属性;相反,有人做BillingPeriod.end_date > date
。