2

我有这个模型:

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 (<=, >=, <, >)..

那么,我该如何实现呢?此外,在我看来,这似乎是一项相当普遍的任务。

4

2 回答 2

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

在每个 put 上更新这些新值(您可以覆盖 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]))
于 2013-02-18T15:34:57.023 回答
2

我选择了这个解决方案:

我在模型中设置了一个ListProperty包含模型制作年份的项目:

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

然后测试:

q = (Vehicle.all()
    .filter('production_years =', 2010))
于 2013-02-27T18:35:06.353 回答