我有这个型号:
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 (<=, >=, <, >)..
所以,我该如何实现这一目标?此外,这对我来说是一项非常普遍的任务。
答案 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))