GAE数据存储:按日期间隔过滤

时间:2013-02-18 14:57:21

标签: google-app-engine google-cloud-datastore

我有这个型号:

class Vehicle(db.Model):
    ...
    start_production_date = db.DateProperty()
    end_production_date = db.DateProperty()

例如,我需要过滤2010年生产中的所有车辆:

我以为我能做到:

q = (Vehicle.all()
    .filter('start_production_date >=', datetime(2010, 1, 1))
    .filter('end_production_date <', datetime(2011, 1, 1)))

买我得BadFilterError

BadFilterError: invalid filter: Only one property per query may have inequality filters (<=, >=, <, >)..

所以,我该如何实现这一目标?此外,这对我来说是一项非常普遍的任务。

2 个答案:

答案 0 :(得分:2)

一种方法是将模型更改为以下内容:

class Vehicle(db.Model):
    ...
    start_production_date = db.DateProperty()
    start_production_year = db.IntegerProperty()
    start_production_month = db.IntegerProperty()
    start_production_day = db.IntegerProperty()

    end_production_date = db.DateProperty()
    end_production_year = db.IntegerProperty()
    end_production_month = db.IntegerProperty()
    end_production_day = db.IntegerProperty()

在每次放置时更新这些新值(您可以override put)和简单的:

# specific year

q = (Vehicle.all()
    .filter('start_production_year =', 2010))

# specific year, different months

q = (Vehicle.all()
    .filter('start_production_year =', 2010)
    .filter('start_production_month IN', [1, 2, 3, 4]))

# different years

q = (Vehicle.all()
    .filter('start_production_year IN', [2010, 2011, 2012]))

答案 1 :(得分:2)

我选择了这个解决方案:

我在模型中设置了ListProperty项,其中包含模型制作的所有年份:

vhl.production_years = range(start_production_date.year, end_production_date + 1)

然后测试:

q = (Vehicle.all()
    .filter('production_years =', 2010))